Poniższy przykład jest podany w książce node.js:Dlaczego pętla while blokuje pętlę zdarzeń węzła?
var open = false;
setTimeout(function() {
open = true
}, 1000)
while (!open) {
console.log('wait');
}
console.log('open sesame');
Wyjaśniając, dlaczego podczas blokuje wykonanie pętli, autor mówi:
Węzeł nigdy wykonać zwrotnego limit czasu, ponieważ pętli zdarzeń jest utknął na tym, podczas gdy pętla rozpoczęła się na linii 7, nigdy nie dając jej szansy , aby przetworzyć event timeout!
Jednak autor nie wyjaśnia, dlaczego tak się dzieje w kontekście pętli zdarzeń lub co naprawdę dzieje się pod maską.
Czy ktoś może to wyjaśnić? Dlaczego węzeł utknął? I jak zmieniłby powyższy kod, zachowując strukturę kontrolną while
, tak aby pętla zdarzeń nie była blokowana i kod będzie zachowywał się tak, jak można by się spodziewać; czekać będzie zalogowany przez 1 sekundę przed ogniem setTimeout
, a następnie proces kończy się po zalogowaniu "open sezam".
Ogólne wyjaśnienia, takie jak odpowiedzi to this question o pętli IO oraz pętli zdarzeń i wywołań zwrotnych nie pomagają mi zracjonalizować tego. Mam nadzieję, że pomoże mi odpowiedź, która bezpośrednio odwołuje się do powyższego kodu.
Możliwy duplikat [W jaki sposób działa unikalny blokujący model IO w pliku Node.js] (http://stackoverflow.com/questions/14795145/how-the-single-threaded-non- blocking-io-model-works-in-node-js) – thefourtheye
Nie zgadzam się, że jest to duplikat. Odwołuje się do konkretnego fragmentu kodu i konkretnego wyjaśnienia tego fragmentu kodu. Pyta również, w jaki sposób można przepisać kod. – codecowboy
Nie ma problemu :-) Mówi się, że jest to * możliwy * duplikat, a nie duplikat. – thefourtheye