Typescript uyku


138

Typecript kullanarak Angular 2'de bir web sitesi geliştiriyorum ve thread.sleep(ms)işlevselliği uygulamanın bir yolu olup olmadığını merak ediyordum .

Benim kullanım durumum, birkaç saniye sonra bir formu gönderdikten sonra kullanıcıları yeniden yönlendirmek, ki bu html veya javascript'te çok kolaydır, ancak bunu Typescript'te nasıl yapacağımı bilmiyorum.

Çok teşekkürler,


8
Typescript, JavaScript'in bir üst kümesidir. Yani bunu JavaScript'te yazın ve işte buyrun: bir TypeScript çözümünüz var.
JB Nizet

Yanıtlar:


205

Artık yalnızca TS'den ES6'ya derleme için desteklendiğinden, ES5 desteği içeren async/ için TypeScript 2.0 beklemeniz gerekir await.

Aşağıdakilerle gecikme işlevi oluşturabilirsiniz async:

function delay(ms: number) {
    return new Promise( resolve => setTimeout(resolve, ms) );
}

Ve ara

await delay(300);

Lütfen awaityalnızca dahili asyncişlevi kullanabileceğinizi unutmayın .

Yapamıyorsanız ( diyelim nodejs uygulaması oluşturuyorsunuz ), kodunuzu anonim asyncfonksiyona yerleştirin. İşte bir örnek:

    (async () => { 
        // Do something before delay
        console.log('before delay')

        await delay(1000);

        // Do something after
        console.log('after delay')
    })();

Örnek TS Uygulaması: https://github.com/v-andrew/ts-template

OLD JS'de kullanmanız gerekir

setTimeout(YourFunctionName, Milliseconds);

veya

setTimeout( () => { /*Your Code*/ }, Milliseconds );

Bununla birlikte, destekleyen her büyük tarayıcıyla async/ awaitartık kullanılmıyor.

Güncelleme: TypeScript 2.1 ile burada async/await.

PromisePromise'in yerel olarak mevcut olmadığı ES5'e derlerken uygulamaya ihtiyacınız olduğunu unutmayın .


1
Güncelleme : async / await ve ES5 / ES3 için jeneratör desteği TypeScript 2.1'e taşındı
v-andrew

8
beklemeden olay, gecikme yapabilirsiniz (20000). sonra (() => {
ZZZ

1
nedense bu benim için işe yaramadı ama işe await new Promise(resolve => setTimeout(resolve, 1000)).then(()=>console.log("fired"));yaradıawait new Promise(resolve => setTimeout(()=>resolve(), 1000)).then(()=>console.log("fired"));
fjch1997

@ fjch1997, asyncişlevine sarın . Örnek ekledim
v-andrew

2
'Gecikme' işlevinin bildirimi, zaten bir vaat döndürdüğü için eşzamansız anahtar sözcüğe ihtiyaç duymaz.
SlavaSt

93

Bu işe yarıyor: (yorumlar sayesinde)

setTimeout(() => 
{
    this.router.navigate(['/']);
},
5000);

1
Sanırım bu, basitlik adına şimdiye kadar kabul edilmiş cevap olmalı.
ekran adı

1
@StefanFalk Merhaba Stefan. Diğer yanıtı kabul ettim çünkü bu yanıtı içeriyordu ve ayrıca gecikmeyi yapmanın başkalarının ilgisini çekebilecek daha fazla "yazı tipi" yolları vardı. Ben şahsen bunu kodum boyunca kullanıyorum, çünkü bu özel görev için zaman uyumsuz / beklemede kullanmanın herhangi bir faydası görmüyorum, ancak bir TS püristi değilim ve daha kolay / daha okunabilir olanı kullanıyorum, bu yüzden sana katılıyorum prensip olarak :).
kha

31

Bazı nedenlerden dolayı, yukarıda kabul edilen yanıt Angular'ın (V6) Yeni sürümlerinde çalışmaz.

bunun için bunu kullanın ..

async delay(ms: number) {
    await new Promise(resolve => setTimeout(()=>resolve(), ms)).then(()=>console.log("fired"));
}

Yukarıdaki benim için çalıştı.

Kullanımı:

this.delay(3000);

VEYA daha doğru bir yol

this.delay(3000).then(any=>{
     //your task after delay.
});

Sadece '1000'i ms parametre çağrısı ile değiştirin, mükemmel olur.
greenskin

15

İle RxJS:

import { timer } from 'rxjs';

// ...

timer(your_delay_in_ms).subscribe(x => { your_action_code_here })

x 0'dır.

Eğer ikinci argüman verirsek periodüzere timer, yeni bir sayı her yayılacaktır periodmilisaniye (x = 0 x = 1, x = 2, ...).

Daha fazla ayrıntı için resmi belgeye bakın.


3
Bu bakış açısı için teşekkürler, "gözlemlenebilir yolu" bulmaya geldim
user230910

0

Angular5 ve üstünü kullanıyorsanız, lütfen aşağıdaki yöntemi ts dosyanıza ekleyin.

async delay(ms: number) {
    await new Promise(resolve => setTimeout(()=>resolve(), ms)).then(()=>console.log("fired"));
}

sonra bu delay () yöntemini istediğiniz yerde çağırın.

Örneğin:

validateInputValues() {
    if (null == this.id|| this.id== "") {
        this.messageService.add(
            {severity: 'error', summary: 'ID is Required.'});
        this.delay(3000).then(any => {
            this.messageService.clear();
        });
    }
}

Bu, 3 saniye sonra mesaj hırlaması kaybolur.


0
import { timer } from 'rxjs';

await timer(1000).take(1).toPromise();

bu benim için daha iyi çalışıyor


"Alma" özelliği, "Gözlemlenebilir <sayı>" türünde mevcut değil.
Anton Duzenko

"rxjs / operators" dan {take} al;
FabioLux

-1

Veya bir işlevi bildirmek yerine, basitçe:

setTimeout(() => {
    console.log('hello');
}, 1000);

Neden bir işlev değil?
Naveen Kumar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.