4

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!

2 Answers 2

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 comments 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.

Sign up to request clarification or add additional context in comments.

Comments

4

Just an addition to Nicholas' great answer:

If you want to avoid using string comparisons for type checks (due to the possibility of namespace collisions), you may be wanting to accomplish 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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.