异步函数返回promise,可不执行难以判断。 Reflect对象对此好像然并卵!各位大大有黑科技的高招??
Promise.resolve
function isAsync(fn) {
return fn.constructor.name === 'AsyncFunction';
}
@justjavac 感谢大大的回复! 但这方法没办法判断返回promise的函数啊,如:
const sleep = ms => new Promise(resolve => {
setTimeout(resolve, ms);
});
@magicdawn 感谢回复 我看了一遍文档,并试了一下,Promise.resolve直接处理函数没用啊!! 你是怎么做的?
@xinggsf 这个是普通函数,不是异步函数。是返回 Promise 的普通函数。
你想实现的是:如何判断一个函数的返回值是不是 Promise?
@justjavac 是啊 异步函数不过是语法糖,返回的也是promise
@xinggsf 如果是这样呢?
function fn(p) {
if (p > 0) {
return p;
} else {
return new Promise .....
}
}
看源码
@AnzerWall 像我上面的例子,看源码也分析不出来,只有执行时才知道。
JS 是弱类型的,返回值你是没法判断出来的。
这个问题属于 X-Y 问题了,还是提出你最原始的需求吧
@atian25 万一最初需求是“我想普通函数直接调用,异步函数用 await 调用”,那就尴尬了
@justjavac 所以咯,需求不清晰的情况下,讨论没啥意义
@atian25 @justjavac 运行之后返回 promise 的函数怎么可能在不运行的情况下判断出来。。。不可能的。
function isAsyncFunction(fn) {
return fn[Symbol.toStringTag] === 'AsyncFunction';
}
你想要的应该是这个吧
co里面的代码,我用过效果挺好,async你可以用上面方法判断,但其实最终也是转换成promise
function isPromise(obj) {
return 'function' == typeof obj.then;
}
function isGenerator(obj) {
return 'function' == typeof obj.next && 'function' == typeof obj.throw;
}
function isGeneratorFunction(obj) {
var constructor = obj.constructor;
if (!constructor) return false;
if ('GeneratorFunction' === constructor.name || 'GeneratorFunction' === constructor.displayName) return true;
return isGenerator(constructor.prototype);
}
来自酷炫的 CNodeMD
toString然后分析函数代码