JavaScript 中如何识别异步函数?

我们如何判断一个函数是否是异步函数(async function)呢?

遇到问题的思考过程是什么呢,首先需要找到二者的区别,那就打印看一下,然后在思考如何做。

由此可以看出二者的差异。

1、使用 typeof 检查函数类型

在 JavaScript 中,async 函数和普通函数在类型上没有区别,直接使用 typeof 判断会得到相同的结果(都是 function)。因此,我们需要使用其他方法。

🌰

javascript 复制代码
function isAsyncFunction(func) {
  console.log(typeof func);
  return typeof func === 'function';
}

console.log(isAsyncFunction(() => {})); // true
console.log(isAsyncFunction(async () => {})); // true

2、 判断函数的 constructor

异步函数的 constructor 是 AsyncFunction,可以使用这个特性来判断:

🌰

javascript 复制代码
function isAsyncFunction(func) {
  console.log(func);
  return func.constructor.name === 'AsyncFunction';
}

console.log(isAsyncFunction(() => {})); // false
console.log(isAsyncFunction(async () => {})); // true

3、通过返回值判断

异步函数的返回值是一个 Promise,而普通函数则不是。因此,可以通过判断函数的返回值是否是 Promise 来区分:

🌰

javascript 复制代码
function isAsyncFunction(func) {
  return func() instanceof Promise;
}

console.log(isAsyncFunction(() => {})); // false
console.log(isAsyncFunction(async () => {})); // true

需要注意的是,这种方法要求我们可以执行函数,并且它不会产生副作用。如果函数执行有副作用,或者不能直接执行(比如依赖参数),就需要更安全的方法。

4、结合 Object.prototype.toString

如果想要更严谨的判断,可以结合 Object.prototype.toString 方法获取函数的内部类型标签,这样可以准确判断是否为 AsyncFunction:

🌰

javascript 复制代码
function isAsyncFunction(func) {
  return Object.prototype.toString.call(func) === '[object AsyncFunction]';
}

console.log(isAsyncFunction(() => {})); // false
console.log(isAsyncFunction(async () => {})); // true

总结:

1)如果不需要执行函数,优先使用 constructor.name 和 Object.prototype.toString 方式判断,这样更加安全。

2)如果可以执行函数(且无副作用),则可以判断返回值是否是 Promise。

相关推荐
规划GIS会3 分钟前
ima知识库第二弹,Python for ArcGIS Pro | 简简单单写个脚本工具
开发语言·python·arcgis
智能编织者4 分钟前
用 Pinia 点燃 Vue 3 应用:状态管理革新之旅
前端·javascript·vue.js
tpoog8 分钟前
[MySQL]数据类型
android·开发语言·数据库·mysql·算法·adb·贪心算法
微臣愚钝10 分钟前
【12】Ajax的原理和解析
前端·javascript·ajax
fengchengwu201212 分钟前
python下载m3u8格式视频
开发语言·python·m3u8
徐小夕@趣谈前端31 分钟前
从零到一开发电子病历编辑器(源码+教程)
前端·javascript·vue.js·编辑器·ecmascript
VBA633742 分钟前
VBA代码解决方案第二十三讲 EXCEL中,如何删除工作表中的空白行
开发语言
martian6651 小时前
Java开发者指南:深入理解HotStuff新型共识算法
java·开发语言
键盘上的GG小怪兽GG2 小时前
Centos主机检查脚本
开发语言·网络·python
Shi_haoliu2 小时前
各种网址整理-vue,前端,linux,ai前端开发,各种开发能用到的网址和一些有用的博客
linux·前端·javascript·vue.js·nginx·前端框架·pdf