我想知道是否有办法确定是否使用async function
或async (...) => ...
语法定义了某个功能?
我希望实现函数isDefinedWithAsync
,其中:
isDefinedWithAsync(async function() { return null; }) === true;
isDefinedWithAsync(function() { return null; }) === false;
isDefinedWithAsync(async () => null) === true;
isDefinedWithAsync(() => null) === false;
是否可以实施isDefinedWithAsync
?如果是这样,怎么样?谢谢!
答案 0 :(得分:3)
是的,
function isAsync(fn) {
return fn.constructor.name === 'AsyncFunction';
}
以下是检查上述2 async
个样本和第3个非异步函数的代码段:
function isAsync(fn) {
return fn.constructor.name === 'AsyncFunction';
}
// async functions
const foo = async () => { }
async function bar () { }
// non-async function
function baz () { }
console.log(isAsync(foo))
console.log(isAsync(bar))
console.log(isAsync(baz))
但正如其他关于该问题的评论所述,您不应该在概念上区分async
函数和Promises
,因为它们或多或少的行为相同。
两者都可以await
- ed / then
- 以完全相同的方式编辑,AFAIK async
标记的函数只返回Promise
。
答案 1 :(得分:0)
只是尼古拉斯出色答案的补充:
如果您像我一样,并且不喜欢通过字符串比较检查对象类(由于命名空间冲突的可能性),那么您可能希望使用instanceof来完成相同的事情:
function isAsync(fn) {
return fn instanceof AsyncFunction;
}
在某些环境中,您可能会得到一个ReferenceError
,提示“未定义AsyncFunction”。
此错误可以通过以下方式解决:
const AsyncFunction = (async () => {}).constructor;
function isAsync(fn) {
return fn instanceof AsyncFunction;
}
现在,即使有一个偶然的巧合,有一个名为“ AsyncFunction”的用户定义的类,您也不会得到假阳性,因为此方法不依赖于字符串比较。