node.js如何callbackasynchronous?
我最近开始与node.js。 它引用了node.js的asynchronous行为,可以通过三种方式使用events
, stream
, callback
。
事件和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()
,导致不同的应用程序逻辑。