Ta funkcja poniżej nie działa tak, jak chcę; będąc nowicjuszem w JS nie wiem, dlaczego.
Muszę poczekać 5 sekund, zanim sprawdzę, czy tak newState
jest -1
.
Obecnie nie czeka, po prostu sprawdza od razu.
function stateChange(newState) {
setTimeout('', 5000);
if(newState == -1) {
alert('VIDEO HAS STOPPED');
}
}
javascript
dom-events
płatek kopii
źródło
źródło
Odpowiedzi:
Musisz umieścić swój kod w funkcji zwrotnej, którą udostępniasz
setTimeout
:Każdy inny kod zostanie wykonany natychmiast.
źródło
Naprawdę nie powinieneś tego robić , prawidłowe użycie limitu czasu jest właściwym narzędziem dla problemu PO i każdej innej okazji, w której po prostu chcesz coś uruchomić po pewnym czasie. Joseph Silber pokazał to dobrze w swojej odpowiedzi. Jeśli jednak w jakimś nieprodukcyjnym przypadku naprawdę chcesz zawiesić główny wątek na pewien czas, zrobi to.
Z wykonaniem w formie:
Przybyłem tutaj, ponieważ budowałem prosty przypadek testowy do sekwencjonowania kombinacji operacji asynchronicznych wokół długotrwałych operacji blokujących (tj. Kosztownej manipulacji DOM) i to jest moja symulowana operacja blokowania. Dobrze pasuje do tej pracy, więc pomyślałem, że opublikuję ją dla każdego, kto przyjedzie tutaj z podobnym przypadkiem użycia. Mimo to tworzy obiekt Date () w pętli while, co może bardzo przytłoczyć GC, jeśli będzie działać wystarczająco długo. Ale nie mogę wystarczająco podkreślić, jest to odpowiednie tylko do testowania, do budowania jakiejkolwiek faktycznej funkcjonalności, którą powinieneś odnieść do odpowiedzi Josepha Silbera.
źródło
Oto rozwiązanie wykorzystujące nową składnię async / await .
Sprawdź obsługę przeglądarki, ponieważ jest to nowa funkcja wprowadzona w ECMAScript 6.
Funkcja użyteczności:
Stosowanie:
Zaletą tego podejścia jest to, że sprawia, że Twój kod wygląda i zachowuje się jak kod synchroniczny.
źródło
Użyj funkcji opóźnienia w następujący sposób:
Stosowanie:
Kredyty: Jak opóźnić procedurę obsługi .keyup (), dopóki użytkownik nie przestanie pisać?
źródło
Nie powinieneś po prostu próbować zatrzymać 5 sekund w javascript. To nie działa w ten sposób. Możesz zaplanować uruchomienie funkcji kodu za 5 sekund od teraz, ale musisz umieścić kod, który chcesz uruchomić później w funkcji, a reszta kodu po tej funkcji będzie nadal działać natychmiast.
Na przykład:
Ale jeśli masz taki kod:
console.log()
Oświadczenie będzie działać natychmiast. Nie będzie czekać, aż upłynie limit czasu wstateChange()
funkcji. Nie można po prostu wstrzymać wykonywania javascript na określony czas.Zamiast tego każdy kod, który chcesz uruchomić, musi znajdować się wewnątrz
setTimeout()
funkcji zwrotnej (lub wywoływanej z tej funkcji).Jeśli spróbujesz „wstrzymać” przez zapętlenie, to zasadniczo zawiesisz interpreter Javascript na pewien czas. Ponieważ JavaScript uruchamia kod tylko w jednym wątku, podczas zapętlania nic innego nie może zostać uruchomione (nie można wywoływać żadnych innych programów obsługi zdarzeń). Pętla oczekująca na zmianę jakiejś zmiennej nigdy nie zadziała, ponieważ żaden inny kod nie może działać, aby zmienić tę zmienną.
źródło
var t = new Date().getTime(); while (new Date().getTime() < t + millisecondsToLockupBrowser);
Jeśli korzystasz z funkcji asynchronicznej , możesz to zrobić w jednym wierszu:
Zauważ , że jeśli celem jest NodeJS, użycie tego będzie bardziej wydajne (jest to predefiniowana, obiecana funkcja setTimeout):
źródło
Spróbuj tego:
źródło
Najlepszym sposobem na utworzenie takiej funkcji jest czekanie w milisekundach, ta funkcja będzie czekać na milisekundy podane w argumencie:
źródło
Na podstawie Josepha Silber za odpowiedź , chciałbym zrobić to tak, że nieco bardziej ogólne.
Miałbyś swoją funkcję (stwórzmy ją na podstawie pytania):
I możesz mieć funkcję oczekiwania:
Na koniec miałbyś:
To rozwiązanie, wolałbym nie używać argumentów w funkcji oczekiwania (aby mieć tylko
foo();
zamiastfoo(arg);
), ale tak jest na przykład.źródło
To rozwiązanie pochodzi z dokumentacji React Native dotyczącej kontroli odświeżania :
Aby zastosować to do pytania PO, możesz użyć tej funkcji w koordynacji z
await
:źródło
Możesz dodać opóźnienie, wprowadzając niewielkie zmiany w funkcji (asynchronizuj i czekaj).
źródło
using angularjs:
źródło
Utwórz nową funkcję Js
Wywołaj funkcję, jeśli chcesz opóźnić wykonanie. Użyj wartości milisekund w int dla wartości opóźnienia.
źródło
Użyłem go do uruchamiania gier komputerowych z Edge lub IE. I automatycznie zamyka IE Edge po 7 sekundach.
Firefox i Google Chrome nie mogą być używane do uruchamiania gier w ten sposób.
źródło