不理解回调和非
在书籍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