最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Determine if function was defined with "async" - Stack Overflow

programmeradmin0浏览0评论

I'm wondering if there's a way to determine if a function was defined using async function or async (...) => ... syntax?

I'm looking to implement the function isDefinedWithAsync where:

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

Is it possible to implement isDefinedWithAsync? And if so, how? Thanks!

I'm wondering if there's a way to determine if a function was defined using async function or async (...) => ... syntax?

I'm looking to implement the function isDefinedWithAsync where:

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

Is it possible to implement isDefinedWithAsync? And if so, how? Thanks!

Share Improve this question edited Apr 30, 2018 at 14:34 nicholaswmin 23k16 gold badges101 silver badges173 bronze badges asked Apr 30, 2018 at 14:17 Gershom MaesGershom Maes 8,1783 gold badges41 silver badges61 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 8

Yes,

Straight from the TC39 async/await Issues:

function isAsync(fn) {
   return fn.constructor.name === 'AsyncFunction';
}

Here's a snippet that checks your 2 async samples above and a 3rd non-async function:

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)) // logs true
console.log(isAsync(bar)) // logs true
console.log(isAsync(baz)) // logs false

But as mentioned in the rest of the ments on that issue, you shouldn't differentiate, at least conceptually, between async functions and Promises since they behave the same.

Both can be await-ed/then-ed in the exact same way. An async marked function always implicitly returns a Promise.

Just an addition to Nicholas' great answer:

If you want to avoid using string parisons for type checks (due to the possibility of namespace collisions), you may be wanting to acplish the same thing with instanceof:

function isAsync(fn) {
  return fn instanceof AsyncFunction;
}

In some environments you may get a ReferenceError that "AsyncFunction is not defined".

This error can be resolved as follows:

const AsyncFunction = (async () => {}).constructor;

function isAsync(fn) {
  return fn instanceof AsyncFunction;
}

Now even a silly case like the following:

isAsync({ constructor: { name: 'AsyncFunction' } });

will correctly return false.

发布评论

评论列表(0)

  1. 暂无评论