确定一个方法是同步的还是asynchronous的

在node.js中,是否可以确定(使用函数)方法是同步的还是asynchronous的?

我想写一个函数,执行以下操作:

function isSynchonous(methodName) { //if the method is synchronous, return true. Otherwise, return false. } 

从语言的angular度来看,这是不可能的,我相信llambda的答案certificate了这一点。

  • 函数可以asynchronous执行,但是同步返回; 比方说,返回被激发的asynchronous任务的数量。
  • 函数可以同步返回代表asynchronous信息的promise。 我会调用这种方法asynchronous,但语言不能真正说明这一点。
  • 在一些不正常的意义上,每一个asynchronous函数“返回”一些… undefined如果没有其他的东西。

从工程angular度来看:

  • 阅读文档。
  • 如果函数接受callback,则可能是asynchronous的。 看function签名。
  • 阅读代码。
  • 使用“常识”。 如果函数执行IO并从IO返回结果,则在某些情况下,它必须是asynchronous的。 这包括文件读取,从标准input读取,保存到数据库以及HTTP / AJAX请求。 注释stream通常用于此,它表示一个asynchronous任务,但callback是特殊的。

另外还有一些function可以混合使用。

 function(callback) { if(ready) { callback(); } else { setTimeout(callback, 5000); } } 

可以说这是非常邪恶的,正确的做法是

 if(ready) { process.nextTick(callback); } 

所以函数具有统一的行为。

然而,至less在Node.js中,有一种奇怪的方式来判断asynchronous是否发生了 。 看到这个讨论 。

 // untested!! please read the documentation on these functions before using yourself var work = process._getActiveHandles().length + process._getActiveCallbacks().length; foo; var newWork = (process._getActiveHandles().length + process._getActiveCallbacks().length) - work; if(newWork > 0) { console.log("asynchronous work took place."); } 

这是有效的,因为按照定义,asynchronous工作无法在同一个tick上parsing,因为Node.js是单线程的。

你不一定知道。 一个函数甚至可以是随机同步的或asynchronous的。

例如,使用另一个函数的函数可以立即执行该函数,也可以使用setImmediate或nextTick计划稍后执行该函数。 该函数甚至可以随机select同步或asynchronous调用其传递的函数,如:

 console.log('Start') function maybeSynchOrAsync(fun) { var rand = Math.floor((Math.random() * 2)) if (rand == 0) { console.log('Executing passed function synchronously') fun() console.log('Done.') } else { console.log('Executing passed function asynchronously via setImmediate') setImmediate(fun) console.log('Done.') } } maybeSynchOrAsync(function () { console.log('The passed function has executed.') }); 

此外,从技术上讲,每个函数调用都是同步的。 如果你调用一个函数FF队列稍后调用一个callback函数(使用setTimeout或任何机制),原函数F仍然有一个同步的返回值(不pipe它是未定义的,一个承诺,一个thunk,或其他)。

不,这是不可能的。 这些方法不仅标记为同步或asynchronous,它们要么使用callback,要么不使用callback。