文章起因
今天在学习 Jasmine(一个 Javascript 的测试框架)中,在阅读文档时看到用来判断是否支持 async 函数的代码。
// 获取 async 函数的原型的构造器
function getAsyncCtor() {
try {
eval(“var func = async function(){};”);
} catch (e) {
return null;
}
return Object.getPrototypeOf(func).constructor;
}
// 如果 getAsyncCtor() 结果为 null,说明运行时不支持 async 函数
function browserHasAsyncAwaitSupport() {
return getAsyncCtor() !== null;
}
让我们简化代码,基于上面的代码我们可以将其合并成为一个函数
function isAsyncAwaitSupport() {
let func;
try {
eval(“func = async function(){};”);
} catch (e) {
return false;
}
// 由于 async 函数的构造器不是全局对象,所以我们需要由下面代码来获取 async 函数的构造器
// 具体可以查看以下 MDN 上有关于 AsyncFunction 的说明,
// 地址:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncFunction
return Object.getPrototypeOf(func).constructor != null;
}
npm 上其实已经有了一个库用来判断运行时是否支持 async/await 了,叫 is-async-supported,但是因为依赖着 nodejs 平台的 vm 内置库,无法运行在非 nodejs 平台。以下是它的代码:
const vm = require(‘vm’)
module.exports = function checkAsyncAwait () {
try {
new vm.Script(‘(async () => ({}))()’)
return true
} catch (e) {
return false
}
}
is-async-await-supported
而我们刚才编写的函数不依赖于 nodejs 平台,所以可以运行在任意 JavaScript 运行时中,比 is-async-supported 库更加通用。目前我已经将这个模块发布到 npm 上面去了,名字叫 is-async-await-supported,代码采用 TypeScript 编写,已经通过 webpack 转义成了 UMD 模块和 ES6 模块,你可以在浏览器和 nodejs 中使用它,你只需通过下述命令安装即可,目前使用文档已经更新好了,使用是否简单,你只需照着文档做就可以了。文档地址:https://www.npmjs.com/package…
npm install –save is-async-await-supported