Chciałbym dodać opóźnienie / sen w while
pętli:
Próbowałem tak:
alert('hi');
for(var start = 1; start < 10; start++) {
setTimeout(function () {
alert('hello');
}, 3000);
}
Tylko pierwszy scenariusz jest prawdziwy: po pokazie alert('hi')
będzie czekał 3 sekundy, następnie alert('hello')
zostanie wyświetlony, ale następnie alert('hello')
będzie się ciągle powtarzał.
Chciałbym tylko, aby po alert('hello')
3 sekundach wyświetlał się po alert('hi')
nim, musi on czekać 3 sekundy po raz drugi alert('hello')
i tak dalej.
źródło
for in
pętla?Object.keys()
setTimeout
zsetInterval
. Limity czasu są domyślnie niszczone, gdy wywoływane jest wywołanie zwrotne.Wypróbuj coś takiego:
źródło
Jeśli używasz ES6, możesz to
let
osiągnąć:Co
let
robi to stwierdzeniei
dla każdej iteracji , a nie pętli. W ten sposób przekazujemysetTimeout
dokładnie to, czego chcemy.źródło
i*3000
argumentu wewnątrz pętli i przekazuje jąsetTimeout
według wartości. Użycielet
jest opcjonalne i niezwiązane z pytaniem i odpowiedzią.i < 10
), dzięki czemu będziesz mieć równolegle wiele liczników pracujących równolegle, które tworzą alokację pamięci, a gorzej na większej liczbie iteracji.Ponieważ ES7 jest lepszym sposobem na oczekiwanie na pętlę:
Gdy silnik dotrze do
await
części, ustawia limit czasu i zatrzymuje wykonywanieasync function
. Następnie po upływie limitu czasu wykonywanie jest kontynuowane w tym punkcie. Jest to bardzo przydatne, ponieważ można opóźnić (1) zagnieżdżone pętle, (2) warunkowo, (3) zagnieżdżone funkcje:Odniesienie do MDN
Chociaż ES7 jest teraz obsługiwany przez NodeJS i nowoczesne przeglądarki, możesz go przetransponować za pomocą BabelJS, aby działał wszędzie.
źródło
break;
może?Innym sposobem jest zwielokrotnienie czasu oczekiwania, ale należy pamiętać, że to nie jest jak sen . Kod po pętli zostanie wykonany natychmiast, tylko wykonanie funkcji zwrotnej jest odroczone.
Pierwszy limit czasu zostanie ustawiony na
3000 * 1
, drugi na3000 * 2
itd.źródło
start
z funkcji za pomocą tej metody.To zadziała
Wypróbuj to skrzypce: https://jsfiddle.net/wgdx8zqq/
źródło
$.Deferred
ale był inny scenariusz, żeby to zadziałało, kciuki do ciebie ..!Myślę, że potrzebujesz czegoś takiego:
Kod testowy:
Uwaga: używanie alertów opóźnia wykonywanie javascript, dopóki alarm nie zostanie zamknięty. Może to być więcej kodu niż prosiłeś, ale jest to solidne rozwiązanie wielokrotnego użytku.
źródło
Prawdopodobnie skorzystałbym
setInteval
. Lubię to,źródło
SetInterval()
utrzymuje tarła „wątki”, nawet w razie jakiegoś błędu lub bloku.W ES6 (ECMAScript 2015) możesz iterować z opóźnieniem z generatorem i interwałem.
Przykład kodu:
Więc jeśli używasz ES6, to najbardziej elegancki sposób na uzyskanie pętli z opóźnieniem (moim zdaniem).
źródło
Możesz użyć operatora interwału RxJS . Interwał emituje liczbę całkowitą co x liczbę sekund, a take określa, ile razy ma on emitować liczby
źródło
Pomyślałem, że też tutaj zamieściłem moje dwa centy. Ta funkcja uruchamia pętlę iteracyjną z opóźnieniem. Zobacz to jsfiddle . Funkcja jest następująca:
Na przykład:
Byłby równoważny z:
źródło
Robię to za pomocą Bluebirda
Promise.delay
i rekurencji.źródło
W ES6 możesz wykonać następujące czynności:
W ES5 możesz zrobić jako:
Powodem jest to,
let
że pozwala deklarować zmienne, które są ograniczone do zakresu instrukcji blokowej lub wyrażenia, w którym jest używana, w przeciwieństwie dovar
słowa kluczowego, które definiuje zmienną globalnie lub lokalnie do całej funkcji, niezależnie od zakresu bloku.źródło
Pokaż fragment kodu
Zmodyfikowana wersja odpowiedzi Daniela Vassallo, ze zmiennymi wyodrębnionymi do parametrów, aby uczynić funkcję bardziej użyteczną:
Najpierw zdefiniujmy niektóre podstawowe zmienne:
Następnie powinieneś zdefiniować funkcję, którą chcesz uruchomić. Zostanie przekazany i, bieżący indeks pętli i długość pętli, w razie potrzeby:
Wersja samodzielna
Wersja funkcjonalna
źródło
źródło
Ty to zrób:
źródło
źródło
Oto jak stworzyłem nieskończoną pętlę z opóźnieniem, które psuje się pod pewnym warunkiem:
Kluczem tutaj jest stworzenie nowej obietnicy, która zostanie rozwiązana po upływie limitu czasu, i oczekiwanie na jej rozwiązanie.
Oczywiście potrzebujesz asynchronizacji / czekaj na wsparcie. Działa w węźle 8.
źródło
do powszechnego użytku „zapomnij o normalnych pętlach” i użyj tej kombinacji „setInterval” obejmuje „setTimeOut”: jak to (z moich prawdziwych zadań).
PS: Zrozum, że prawdziwe zachowanie (setTimeOut): wszystkie zaczną się w tym samym czasie „trzy bla bla bla zaczną odliczać w tym samym momencie”, więc ustal inny czas na zorganizowanie wykonania.
PS 2: przykład dla pętli czasowej, ale dla pętli reakcyjnych możesz użyć zdarzeń, obiecaj, że async czeka.
źródło
źródło
Według mojej wiedzy
setTimeout
funkcja ta jest wywoływana asynchronicznie. Możesz zawinąć całą pętlę w funkcję asynchroniczną i poczekać naPromise
zawartość setTimeout, jak pokazano:A potem wywołujesz tak:
Poświęć trochę czasu, aby dobrze zrozumieć programowanie asynchroniczne.
źródło
Po prostu spróbuj tego
Wynik
źródło
Oto funkcja, której używam do zapętlania tablicy:
Używasz go w ten sposób:
źródło
Ten skrypt działa na większość rzeczy
źródło
Spróbuj tego...
źródło
Prosta implementacja pokazywania fragmentu tekstu co dwie sekundy, dopóki pętla jest uruchomiona.
źródło
Spróbuj tego
źródło