不明白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()调用之后的代码可以继续被执行。
- 当我将数据保存到mongoDB时,如何获得_id值到我的代码中
- 使用Sequelize.js自定义validation错误
- 防止Express.js崩溃
- 节点/ Angular / Passport / Satellizer基于令牌的Facebook身份validation不返回令牌
- nodejs socketio多个域(单独的io)
- 无法连接到本地主机:1433 – 连接ECONNREFUSED 127.0.0.1:1433
- Node.js Express:需要/使用另一个应用程序
- 如何将JSON数据从Node.js res.render方法传递给客户机上的react.js
- 使用node.js和Jade但是index.jade没有显示出来