不明白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()调用之后的代码可以继续被执行。
- 如何获得代码参数在和节点JS Slack的oAuth进程?
- 创build不同types的圈子,如GooglePlus
- 如何validationExpress Nodejsstring中的body参数是否可以使用express-validation和joi转换为JSON
- Web Audio Api:通过套接字从nodejs服务器播放数据块的正确方法
- 使用博世和Strophe将ejabberd集成到现有的nodejs应用程序中
- 在SemaphoreCI上升级NodeJS
- 快递应用程序不听不带端口
- 令牌和安全与条纹api为node.js(条纹节点)
- webpack-dev-server无法find模块'webpack'