不明白callback和非阻塞的例子 – Node.js

在书籍Hands-on节点中,作者给出了阻止I \ O的例子,

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

作者说,直到第1行完成执行数据库查询,什么都没有执行

然后,他显示非阻塞代码

 callback = function(post){ doSomethingWithPost(post) } db.query("select * from posts where id = 1",callback); doSomethingElse(); 

这是不是也阻止,直到查询被执行?

所以,doSomethingElse将不会执行直到查询完成。

你应该总是读doRealStuff( params, callback )这样的非阻塞函数作为“把doRealStuff,params和callback放到队列中,当到达队列尾时做callback()”。 这也可以帮助避免像这样的错误

 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 

作者是绝对正确的。 如果第二个示例是非阻塞的,则代码执行将触发查询,然后继续执行其余的代码。 callback函数将在查询完成后,在未来某个不确定的时刻被调用。 doSomethingElse(); 将被立即调用。

实际上,这个例子阻塞与非阻塞的例子在你提供的例子中并不清楚。 这将是数据库实施内部的东西。 也许通过传入一个callback参数来表示请求应该是非阻塞的。

希望有帮助,泰勒。

Ryan Dahl的介绍是一个相当不错的概述,但是这个初学者的教程非常好 ,它以一种友好的方式详细解释了Javascript(和Node)中非阻塞操作的前提。

但是简而言之,在第二个例子中,callback参数在db.query完成之前是不会被执行的,它会被“hold on for later”,这意味着db.query()调用之后的代码可以继续被执行。