不理解回调和非

在书籍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()”。 这也可能有助于避免类似的错误

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

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

在你提供的例子中,这个例子阻塞与非阻塞实际上是不清楚的。 这将是数据库实施的内在内容。 也许通过传入一个回调参数表明请求应该是非阻塞的。

希望这会有所帮助,泰勒。


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

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

链接地址: http://www.djcxy.com/p/52501.html

上一篇: Don't understand the callback and non

下一篇: blocking read on a subprocess.PIPE in python