我正在howtonode阅读这篇文章, 但不知道为什么它是假的异步?
所以假的异步被描述为:
function asyncFake(data, callback) {
if(data === 'foo') callback(true);
else callback(false);
}
asyncFake('bar', function(result) {
// this callback is actually called synchronously!
});
纠正代码:始终异步
function asyncReal(data, callback) {
process.nextTick(function() {
callback(data === 'foo');
});
}
我的问题是代码的第一部分有什么问题? 为什么nextTick()可以承诺“正确的”#39;效果?...
请向我解释。感谢。
答案 0 :(得分:2)
第一个案例没有错误。但是,您必须积极主动(作为开发人员)才能准确了解代码中发生的情况。
在第一种情况下,您没有进行任何I / O,并且callback
实际上并未放入事件循环中。它就像这样做:
if(data === 'foo')
return true;
else
return false;
但是,在第二种情况下, 将回调放入事件循环,直到下一次迭代。
就事情如何运作而言,没有错。但是,您需要了解其含义。
例如:
function maybeSync(a, cb) {
if(a === 'a') {
cb('maybeSync called');
} else {
// put the called into event-loop for the next iteration
process.nextTick(function() {
cb('maybeSync called');
});
}
}
function definitelySync() {
console.log('definitelySync called');
}
someAsync('a', function(out) {
console.log(out);
});
definitelySync();
在最好的情况下,首先调用哪一个?
如果输入是" a"然后输出是:
maybeSync called
definitelySync called
如果输入是其他内容(例如不是" a")那么输出将是:
definitelySync called
maybeSync called
您需要使它们保持一致,因为如果callback
可以根据条件调用同步/异步,则很容易区分。再次回到负责任,保持一致并意识到代码中发生了什么。 =)
答案 1 :(得分:0)
在异步伪函数中 - 您可以看到回调被称为正常函数调用,即在同一个调用堆栈中。
通过使用流程滴答 - 我们只是提交要安排执行的回调函数。
此过程勾选呼叫立即完成,并且asyncreal将立即返回。因此回调将以异步方式执行。