确定一个方法是同步的还是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.') });
此外,从技术上讲,每个函数调用都是同步的。 如果你调用一个函数F , F队列稍后调用一个callback函数(使用setTimeout或任何机制),原函数F仍然有一个同步的返回值(不pipe它是未定义的,一个承诺,一个thunk,或其他)。
不,这是不可能的。 这些方法不仅标记为同步或asynchronous,它们要么使用callback,要么不使用callback。