【发布时间】:2012-09-22 17:09:45
【问题描述】:
在node.js中,是否可以(使用函数)判断一个方法是同步的还是异步的?
我想编写一个执行以下操作的函数:
function isSynchonous(methodName) {
//if the method is synchronous, return true. Otherwise, return false.
}
【问题讨论】:
标签: javascript node.js
在node.js中,是否可以(使用函数)判断一个方法是同步的还是异步的?
我想编写一个执行以下操作的函数:
function isSynchonous(methodName) {
//if the method is synchronous, return true. Otherwise, return false.
}
【问题讨论】:
标签: javascript node.js
不,那是不可能的。这些方法不仅标记为同步或异步,它们要么使用回调,要么不使用。
【讨论】:
process.nextTick
你不一定知道。一个函数甚至可以是随机同步或异步的。
例如,一个接受另一个函数的函数可以立即执行该函数,或者它可以使用 setImmediate 或 nextTick 安排在以后执行它。该函数甚至可以随机选择同步或异步调用其传递的函数,例如:
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 将一个回调函数排队等待稍后调用(使用 setTimeout 或任何机制),原始函数 F仍然有一个同步的返回值(无论是未定义的、promise、thunk 还是其他)。
【讨论】:
从语言的角度来看,这是不可能的,我相信 llambda 的回答证明了这一点。
undefined,如果没有别的。从工程的角度来看:
此外,还有 函数将两者混合在一起。
function(callback) {
if(ready) {
callback();
}
else {
setTimeout(callback, 5000);
}
}
可以说这是非常邪恶的,正确的做法应该是
if(ready) {
process.nextTick(callback);
}
所以函数具有统一的行为。
不过, 是一种很老套的方法来判断是否发生了异步事件,至少在 Node.js 中是这样。见this discussion。
// 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.");
}
这是因为异步工作不能在同一个刻度上解决,根据定义,并且因为 Node.js 是单线程的。
【讨论】:
为什么你需要知道,才是真正的问题。
话虽如此;这可以通过新的 JS 抽象来实现。现在,对于由前面的 async 关键字明确定义的异步函数,您可以执行类似的测试;
async function test(){}
var type = Object.getPrototypeOf(test).constructor.name;
console.log(type); // <- 'AsyncFunction'
酷..!
对于那些碰巧返回一个promise的普通函数,我们必须记住它只是一个同步函数立即同步返回一个promise对象。这意味着您必须在调用函数之前动态检查函数是否提前返回承诺。我认为这将带您进入类型级别的编程冒险,这种冒险存在于 Haskell 等复杂语言中。
【讨论】: