确定是否使用" async"定义了函数。

时间:2018-04-30 14:17:57

标签: javascript

我想知道是否有办法确定是否使用async functionasync (...) => ...语法定义了某个功能?

我希望实现函数isDefinedWithAsync,其中:

isDefinedWithAsync(async function() { return null; }) === true;
isDefinedWithAsync(function() { return null; }) === false;
isDefinedWithAsync(async () => null) === true;
isDefinedWithAsync(() => null) === false;

是否可以实施isDefinedWithAsync?如果是这样,怎么样?谢谢!

2 个答案:

答案 0 :(得分:3)

是的,

直接来自TC39 async/await Issues

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”的用户定义的类,您也不会得到假阳性,因为此方法不依赖于字符串比较。