我正在学习node.js.到目前为止,我已经理解了回调意味着什么,但我不确定是否将同步执行回调(调用者在回调返回之前不会继续执行)或异步(调用者进行回调并继续执行其代码)。
答案 0 :(得分:3)
通过查看函数调用,你无法真正说出来。 Some callbacks are asynchronous, others are not。您需要检查文档, 应该在那里说明。
通常你可以通过函数的签名来区分它们。如果预期回调只用计算结果调用一次,并且回调和函数都不返回任何内容,则回调通常是异步调用的(setTimeout
,readFile
等) 。如果函数立即返回结果,则通常会同步多次调用回调(Array::sort
,Array::map
)并生成有价值的值。当然,例外证明了这一规则,有时您无法轻易说出,例如: setInterval
vs Array::forEach
(两者都不返回,并多次调用回调)。
答案 1 :(得分:1)
我会尝试重新解释你的问题,因为“异步函数调用”和“异步IO”术语存在很多混淆。
让我们这样写:给定下面的代码,并且不查看“foo”源代码,我们可以运行一些测试来说明输出是“Line 1 \ nLine2”还是“Line 2 \ nLine1”?
var t1 = asyncTestCapture();
foo(function() {
console.log("Line 1");
});
console.log("Line 2");
var out12vsOut21 = asyncTestVerify(t1);
答案1:不要试图依赖这个顺序,因为一个众所周知的带有回调参数的标准函数(Array的forEach,map等,String replacer,JSON reviver)
答案2 :(请注意,我非常简短地测试了代码,并且它是node.js特定的,但我相信它可以回答“out12vsOut21”问题。还要注意我正在使用未记录的节点函数)
function asyncTestCapture() {
return {
activeHandles: process._getActiveHandles(),
activeRequests: process._getActiveRequests()
};
}
function asyncTestVerify(handles1) {
var handles2 = asyncTestCapture();
return handles2.activeHandles === handles1.activeHandles && handles2.activeRequests === handles1.activeRequests
}
我会再说一遍:如果您需要上面的代码,那么您的设计就会出现问题。你不需要知道“out12vsOut21”的顺序,按照它不依赖于“异步或不foo”的方式构建你的代码
答案 2 :(得分:-1)
你可以使用一个标志:
var async = false;
someFunction(function () {
console.log(async ? 'async' : 'sync');
});
async = true;