2011-07-11 10 views
6

W książce Ręce na węźle, autor podaje przykład blokowanie I \ O,nie rozumieją zwrotnego i non-blocking przykład - node.js

var post = db.query("select * from posts where id = 1"); 
doSomethingWithPost(post) 
doSomethingElse(); 

autor mówi nic nie jest wykonywane linia 1 jest aż zakończeniu wykonywania kwerendy db

, a potem pokazuje kod non-blocking

callback = function(post){ 
doSomethingWithPost(post) 
} 

db.query("select * from posts where id = 1",callback); 
doSomethingElse(); 

Czy to nie jest również blokowanie aż kwerenda jest wykonywana?

Tak, doSomethingElse nie zostanie wykonany, dopóki zapytanie nie zostanie zakończone.

Odpowiedz

2

Autor jest całkowicie poprawny. Jeśli drugi przykład nie jest blokowany, wykonanie kodu wywoła zapytanie, a następnie kontynuuje wykonywanie reszty kodu. Funkcja wywołania zwrotnego zostanie wywołana po zakończeniu zapytania, w pewnym nieokreślonym punkcie w przyszłości. doSomethingElse(); zostanie wywołany natychmiast.

Co faktycznie sprawia, że ​​ten przykład blokowania kontra nieblokujący nie jest jasny w dostarczonych przykładach. Będzie to coś wewnętrznego dla implementacji DB. Być może przekazując parametr callback wskazuje, że żądanie nie powinno być blokowane.

Mam nadzieję, że to pomoże, tyler.

+0

Nadal nie get..say jeśli 'zapytania (String, callback) {// implementaion dla retreiving rekordy dla danego łańcucha zapytania ... zrobić trochę czasu, aby wykonaj ... Na podstawie usuniętych pobranych wywołaj wywołanie zwrotne} '. Dla mnie jest to również blokowanie ... bez bazy danych jest zapytał wywołania zwrotnego nie będzie wykonać .. będzie czekać .. PRAWO !! – prvn

2

Ryan Dahl's intro to całkiem niezły przegląd, ale this beginner's tutorial is excellent, szczegółowo i w przyjazny sposób wyjaśnia założenie operacji nie blokujących w JavaScript (i tym samym Node).

Ale w dużym skrócie, parametr wywołania zwrotnego z drugiego wysłanego przykładu nie jest wykonywany, dopóki db.query nie zakończy się, jest "przetrzymywany przez później", co oznacza kod po db.query() połączenie może być nadal wykonywane.

6

Powinieneś zawsze czytać funkcje bez blokowania, takie jak doRealStuff(params, callback) jako "put doRealStuff, parametry i wywołanie zwrotne w kolejce, wykonaj wywołanie zwrotne() po osiągnięciu końca kolejki". To również może pomóc uniknąć robi błędy jak

for (var i=0; i < 1000000; i++) 
{ 
    // I want to do many http requests now 
    do_request(test_url); 
} 

// not a single byte is sent here because event loop was blocked by for loop 
+0

dobry przykład :) – danjah

+1

istnieje również dobre asynchroniczne wyjaśnienie frazeusza pływające z Nodebeginner: "W węźle wszystko działa równolegle, z wyjątkiem kodu" - http://nodebeginner.org/index.html –

Powiązane problemy