不理解回调和非阻塞示例 - Node.js

时间:2011-07-11 04:41:44

标签: node.js

在动手节点一书中,作者举了一个阻止I \ O,

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

作者说在第1行完成执行db query

之前没有执行任何操作

然后,他显示非阻塞代码

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

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

在查询执行之前,这还不会阻塞吗?

因此,在查询完成之前,不会执行doSomethingElse。

3 个答案:

答案 0 :(得分:6)

你应该总是把像doRealStuff( params, callback )这样的非阻塞函数读作“在队列中放入doRealStuff,params和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

答案 1 :(得分:2)

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

在您提供的示例中,实际上使阻止与非阻塞的示例不明确。它将是数据库实现的内部内容。也许通过传入一个回调参数,您指示请求应该是非阻塞的。

希望有帮助, 泰勒。

答案 2 :(得分:2)

Ryan Dahl's intro是一个相当不错的概述,但this beginner's tutorial is excellent,它以友好的方式详细解释了Javascript(以及Node)中非/阻塞操作的前提。

但简而言之,您发布的第二个示例中的回调参数在db.query完成之前不会执行,它会“保留以供以后使用”,这意味着在db.query()调用之后的代码可以继续执行。