node.js如何callbackasynchronous?

我最近开始与node.js。 它引用了node.js的asynchronous行为,可以通过三种方式使用eventsstreamcallback

事件和stream处理emit,pipe事件使其真正asynchronous,但如何callbackasynchronous,因为它在函数返回之前执行 ,除非使用process.nextTick()

事件:

 event.on('data',function(data){ }); 

回电话:

 function(data,cb){ // do something with "data" cb(); return; } 

让我们仔细看看有callback的函数:

 function(data, cb) { // do something with "data" cb(); return; } 

你在这里有两个大错误:

1)当你有一个callback函数时,你没有理由使用return。 只有当您有同步动作立即发送响应(他们不必等待将来某个时候触发callback)时才会使用返回。

2)你不立即执行callback,这是没有任何意义的。 你要么不使用callback函数,而要使用return语句(当你真的没有asynchronous函数的时候)或者在将来某个时候执行callback函数的时候。

更好的例子:

 function (data, cb) { // you make an Ajax call and // you don't know when the callback will be triggered makeAjaxCall(data, cb); } 

您的callback并不一定意味着asynchronousI / O。

事件不一定是asynchronous的,因为EventEmitter的.emit立即工作,而不是下一个打勾:

 var EventEmitter = require('events').EventEmitter; var emitter = new EventEmitter(); emitter.on('ev', function(x) { console.log("received event ", x); }); console.log("Hello"); emitter.emit('ev', "X"); console.log("World"); 

结果:

 Hello received event X World 

不过,callback可以通过以下方式进行“asynchronous”:

  • 使用process.nextTick()。 这不会使callbackasynchronous中的实际I / O操作。 它只是推迟执行,直到下一个滴答声。 如果一些操作块,事件循环也将阻塞 – 在下一个滴答而不是这个滴答。

     function(data, cb) { process.nextTick(function() { doSomethingWith(data); cb(); }) }); 
  • 从已知由asynchronousI / O操作触发的事件中调用指定的callback函数

     function(data, cb) { emitter.startIO(); emitter.on('someIOEvent', function(e) { doSomethingWith(data,e); cb(); }); }); 
  • 使用另一个基于callback的函数,这个函数是asynchronous的。 节点核心和节点模块中的大部分function都是这样的。

     function(data, cb) { otherFunction(data, function(moredata) { doMoreStuffWith(moredata, data); cb(); }); }); 

在这种情况下,具有callback的函数不是asynchronous运行的,但是仍然存在这样的函数可以asynchronous使用的情况:

 function foo(data, callback) { // do something with the data callback(); } function bar() { // this will be called as a callback from foo() } setInterval(function() { foo(data, bar) }, 1000); console.log('this is displayed immediately'); 

您可以看到foo()计划每秒运行一次,而且这是asynchronous发生的; 然而,callback的存在允许你从foo()函数外部设置额外的行为,例如你可能会设置几个不同的callback函数调用foo() ,导致不同的应用程序逻辑。