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

rus*_*kin 6 node.js

在动手节点一书中,作者举了一个阻塞I\O的例子,

var post = db.query("select * from posts where id = 1");
doSomethingWithPost(post)
doSomethingElse();
Run Code Online (Sandbox Code Playgroud)

作者说在第1行完成执行db查询之前没有执行任何操作

然后,他显示了非阻塞代码

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

db.query("select * from posts where id = 1",callback);
doSomethingElse();
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*rov 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
Run Code Online (Sandbox Code Playgroud)


Tyl*_*eto 2

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

在您提供的示例中,尚不清楚究竟是什么使这个示例阻塞与非阻塞。这将是数据库实现的内部内容。也许通过传入回调参数,您表明请求应该是非阻塞的。

希望这有帮助,泰勒。