function doStuff (someValue, someOtherValue, someCallBack) {
console.log("First Value: " + someValue);
while(someValue-- != 0) {console.log(someValue);}
someCallBack(someOtherValue);
}
function delayEventLoopMore(someValue) {
while(someValue-- != 0) {console.log('The value:' + someValue);}
}
doStuff(100000, 100000, delayEventLoopMore);
console.log('YAY!');
前面的代码是一个涉及回调的阻塞代码示例。显然,简单地提供回调参数并没有使这段代码成为非阻塞的。如果你运行它,你应该清楚地看到从 100,000 到 0 的两个不同的计数,然后最后打印“YAY”。如果这个函数是非阻塞的,我们肯定会有足够的时间来打印'Yay'。如果您对此表示怀疑,请随意将值增加到数百万甚至数十亿。'Yay' 将永远是最后打印的内容。
真正的异步、非阻塞行为来自 V8 后端。复制它的唯一方法是生成本机扩展。
这是此功能的两个版本:
exports.log = function (someFileName) {
var results;
results = fs.readFileSync(someFileName);
return results;
}
exports.log = function (someFileName, callback) {
var results;
fs.readFile(someFileName, function(data) {
results = data;//unnecessary just for clarity!
callback(results);
}
}
第一个版本假定您正在执行的任何操作都是同步的。在这种情况下使用回调绝对没有任何好处。只需返回结果。无论哪种方式,它都会在事件循环中导致完全相同的延迟量。如果您必须在这里做的工作是 CPU 密集型的,那么您可能会遇到这种情况。
如果它是 I/O 密集型的,您可以做两件事之一。A:利用已经开发的异步节点模块:http,fs,有一些很好的 mongodb 东西,等等......或者如果您的用例不存在,请为其开发本机扩展。无论如何,您返回结果的方式是获取用户提供给您的回调,并使用您在异步操作过程中建立的“结果”内容调用此回调。