2014-09-26 56 views
4

我正在学习node.js.到目前为止,我已经理解了回调的含义,但我不确定是否要同步执行回调(调用者不会继续前进,直到回调返回)或异步(调用者进行回调并继续执行其代码)。如何识别回调是要同步执行还是异步执行?

+1

好问题,欢迎来到SO :) – DrakaSAN 2014-09-26 10:02:34

+0

谢谢DrakaSAN :) – avinashkrsharma 2014-09-26 10:19:18

+0

我问过它node.js的上下文 – avinashkrsharma 2014-09-26 11:15:51

回答

3

你真的无法通过查看函数调用出来。 Some callbacks are asynchronous, others are not。您需要检查文档,它应该在那里陈述。

通常你可以通过函数的签名来区分它们。如果回调预计只有一次计算结果被调用,并且回调函数和函数都不返回任何东西,回调通常是异步调用的(setTimeoutreadFile等)。如果函数立即返回结果,则通常会同步调用多次回调(Array::sort,Array::map)并生成有价值的值。当然,例外证明了这一规则,有时你不能轻易说出,例如setInterval vs Array::forEach(两者都不返回,并且多次调用回调)。

-1

您可以使用一个标志是:

var async = false; 

someFunction(function() { 
    console.log(async ? 'async' : 'sync'); 
}); 

async = true; 
+0

我不想使用标志。 – avinashkrsharma 2014-09-26 11:08:35

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,地图等,字符串替代品,JSON齐磊)

回答一个众所周知的标准功能上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”命令,以不依赖于“async或not foo”的方式构建你的代码。