Czy jest sposób, aby przespać JavaScript, zanim wykona on inną akcję?
Przykład:
var a = 1+3;
// Sleep 3 seconds before the next action here
var b = a + 4;
javascript
sleep
Jin Yong
źródło
źródło
Na wypadek, gdybyś naprawdę
sleep()
chciał coś przetestować. Należy jednak pamiętać, że podczas debugowania najczęściej powoduje awarię przeglądarki - prawdopodobnie dlatego i tak jest to potrzebne. W trybie produkcyjnym wykomentuję tę funkcję.Nie używaj
new Date()
w pętli, chyba że chcesz marnować pamięć, moc obliczeniową, baterię i ewentualnie żywotność urządzenia.źródło
Wersja ECMAScript 6 wykorzystująca generatory z wydajnością do „blokowania kodu”:
Ponieważ oryginalne pytanie zostało wysłane siedem lat temu, nie zawracałem sobie głowy udzieleniem dokładnego kodu, ponieważ jest po prostu zbyt łatwe i już na nie odpowiedziałem. Powinno to pomóc w bardziej skomplikowanych problemach, na przykład jeśli potrzebujesz co najmniej dwóch uśpień lub jeśli planujesz sekwencyjne wykonywanie asynchroniczne. Możesz go zmodyfikować, aby dopasować go do swoich potrzeb.
funkcjonować*
() => funkcja strzałki
Możesz także łączyć wydarzenia za pomocą Obietnic :
Albo byłby znacznie prostszy i mniej wyszukany sposób
Jeśli tylko czekasz na wystąpienie jakiegoś warunku, możesz poczekać w ten sposób
źródło
Aktualizacja 2018
Najnowsze przeglądarki Safari, Firefox i Node.js obsługują teraz również async / await / promises.
Korzystanie z async / await / Promises:
(Od 1/2017 obsługiwane w przeglądarce Chrome, ale nie w Safari, Internet Explorer, Firefox, Node.js)
Aktualizacja 2017
JavaScript ewoluował od czasu zadania tego pytania i ma teraz funkcje generatora, a nowy async / await / Promise jest wdrażany.
Poniżej znajdują się dwa rozwiązania, jedno z funkcją generatora, które będzie działać we wszystkich nowoczesnych przeglądarkach, a drugie, wykorzystujące nowy async / await, który nie jest jeszcze wszędzie obsługiwany.Korzystanie z funkcji generatora:
Zwróć uwagę, że oba te rozwiązania mają charakter asynchroniczny. Oznacza to, że myAsyncFunc (w obu przypadkach) powróci podczas snu.
Należy zauważyć, że to pytanie jest inne niż Jaka jest wersja funkcji sleep () w języku JavaScript? gdzie żądający prosi o prawdziwy sen (brak wykonania innego kodu w procesie) zamiast opóźnienia między akcjami.
źródło
let co = gen => (...args) => { let iter = gen(...args); let resume = () => new Promise((resolve, reject) => { let result = iter.next(); if (result.done) resolve(result.value); else Promise.resolve(result.value).then(resume).then(resolve, reject); }); return resume(); };
pozwoliłoby cilet asyncAdd = co(function* (a, b) { console.log('Sleeping'); yield sleep(3000); console.log('Done'); return a + b; }); asyncAdd(3, 4).then(console.log);
użyć definicjisleep()
z drugiego bloku kodu.Jeśli potrzebujesz mniej niezgrabnych funkcji niż
setTimeout
isetInterval
, możesz opakować je w funkcje, które po prostu odwracają kolejność argumentów i nadają im ładne nazwy:Wersje CoffeeScript:
Następnie możesz ich ładnie używać z anonimowymi funkcjami:
Teraz można go łatwo odczytać jako „po N milisekundach…” (lub „co N milisekundach…”)
źródło
Innym sposobem jest użycie Promise i setTimeout (pamiętaj, że musisz być wewnątrz funkcji i ustawić ją jako asynchroniczną ze słowem kluczowym async):
źródło
Oto bardzo prosty sposób na zrobienie tego, który `` czuje się '' jak synchroniczny sen / pauza, ale jest legalnym kodem asynchronicznym js.
źródło
Możesz użyć zwykłego javascript, to wywoła twoją funkcję / metodę po 5 sekundach:
źródło
Istnieje kilka sposobów rozwiązania tego problemu. Jeśli korzystamy z
setTimeout
funkcji, najpierw ją poznajmy. Ta funkcja ma trzy parametry:function
lubcode
,delay
(w milisekundach) iparameters
. Ponieważ parametr funkcji lub kodu jest wymagany, pozostałe są opcjonalne. Jeśli nie wprowadziłeś opóźnienia , zostanie ono ustawione na zero.Aby uzyskać więcej informacji na temat
setTimeout()
tego łącza .Wersja uproszczona:
Korzystanie z parametru pass:
Obsługa przeglądarek:
źródło
To jest mój model, który pokazuje, jak "spać" lub "DoEvents" w javascript przy użyciu funkcji generatora (ES6). Skomentowany kod:
źródło
Wypróbuj tę funkcję:
Oto jak go używasz:
Lub obiecaj styl:
Oto demo .
źródło