2011-07-11 24 views
6

Trong cuốn sách Hands-on nút, tác giả đưa ra một ví dụ về blocking I \ O,Không hiểu khi gọi lại và non-blocking dụ - Node.js

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

Tác giả nói gì được thực hiện đến dòng 1 là hoàn tất thi công db truy vấn

Và, sau đó ông cho thấy non-blocking đang

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

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

không phải là điều này cũng ngăn chặn cho đến khi truy vấn được thực hiện?

Vì vậy, doSomethingElse sẽ không được thực thi cho đến khi truy vấn được hoàn tất.

Trả lời

2

Tác giả hoàn toàn chính xác. Nếu ví dụ thứ hai là không chặn, việc thực thi mã sẽ kích hoạt truy vấn và sau đó tiếp tục thực thi phần còn lại của mã. Hàm gọi lại sẽ được gọi sau khi truy vấn hoàn tất, tại một số điểm chưa được xác định trong tương lai. doSomethingElse(); sẽ được gọi ngay lập tức.

Điều gì thực sự làm cho ví dụ này chặn và không chặn không rõ ràng trong các ví dụ bạn đã cung cấp. Nó sẽ là một cái gì đó nội bộ để thực hiện DB. Có lẽ bằng cách chuyển qua tham số gọi lại, bạn cho biết rằng yêu cầu sẽ không bị chặn.

Hy vọng điều đó sẽ giúp ích, tyler.

+0

Tôi vẫn không nhận được ... nếu 'truy vấn (String, Callback) {// implementaion để truy xuất hồ sơ cho chuỗi truy vấn đã cho ... hãy dành thời gian để thực thi ... Trên cơ sở các resuts được tìm nạp gọi callback} '. Đối với tôi điều này cũng đang chặn..không có cơ sở dữ liệu nào được truy vấn gọi lại sẽ không thực thi..vậy đợi..Đúng !! – prvn

2

Ryan Dahl's intro là một tổng quan khá tốt, nhưng this beginner's tutorial is excellent, nó giải thích chi tiết và một cách thân thiện tiền đề của các hoạt động không/chặn trong Javascript (và do đó Node).

Nhưng tóm lại, tham số gọi lại trong ví dụ thứ 2 mà bạn đã đăng không được thực hiện cho đến khi db.query kết thúc, nó được "giữ lại cho sau", có nghĩa là mã sau db.query() cuộc gọi có thể tiếp tục được thực hiện.

6

Bạn nên luôn đọc các chức năng không chặn như doRealStuff(params, callback) là "đặt doRealStuff, thông số và gọi lại trong hàng đợi, thực hiện gọi lại() khi kết thúc xếp hàng đến". Điều này cũng có thể giúp tránh những sai lầm như

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

ví dụ tốt :) – danjah

+1

cũng có giải thích đồng bộ tốt cụm từ nổi xung quanh từ Nodebeginner: "Trong nút, mọi thứ chạy song song, ngoại trừ mã của bạn" - http://nodebeginner.org/index.html –

Các vấn đề liên quan