Wiedząc, że podczas node.js pracuje asynchronicznie, pisząc coś takiego:node.js: pętla zwrotna nie działa zgodnie z oczekiwaniami
function sleep() {
var stop = new Date().getTime();
while(new Date().getTime < stop + 15000) {
;
}
}
sleep();
console.log("done");
... nazwałbym sleep(), zablokować serwer dla czas trwania pętli while (15secs) i właśnie THEN print "done" na konsolę. O ile rozumiem, dzieje się tak dlatego, że Node.js zapewnia dostęp do głównego wątku tylko w języku JavaScript, a zatem to porwanie rzeczy powstrzymałoby dalszą realizację.
Rozumiem Rozwiązaniem tego problemu jest użycie wywołań zwrotnych:
function sleep(callback) {
var stop = new Date().getTime();
while(new Date().getTime() < stop + 15000) {
;
}
callback();
}
sleep(function() {
console.log("done sleeping");
});
console.log("DONE");
więc myślałem, że to będzie drukować 'Gotowe' i po 15 sek. "done sleeping", ponieważ funkcja sleep() zostaje wywołana i przekazuje wskaźnik do funkcji wywołania zwrotnego. Gdy ta funkcja działa (pętla while), wykonywana jest ostatnia linia (print 'done'). Po 15 sekundach, gdy funkcja uśpienia() zostanie zakończona, wywołuje daną funkcję zwrotną, która następnie wypisuje "done sleeping".
Najwyraźniej zrozumiałem, że coś tutaj nie tak, ponieważ oba powyższe sposoby blokują. Czy ktoś może to wyjaśnić?
Dzięki z góry, Slagjoeyoco
Jesteś komplikuje się. Prosty setTimeout (callback, delay) powinien wystarczyć do wyprodukowania tego samego, co instrukcja asynchronicznie. –
@ FabiánH.jr. chodzi o to, że OP może być zainteresowany zrozumieniem, dlaczego jego 'while' nie działa i jak" while "można pisać w sposób nieblokujący, co jest lepszą odpowiedzią niż" nie ma znaczenia twoja metoda nie działa, zrób to w inny sposób ". – Mahn
Cóż, prawda, ogólnie rzecz biorąc, ogólnie rzecz biorąc, a teraz, gdy o tym wspomniałeś, było to bardzo wnikliwe w wewnętrznym procesie node.js –