而井教你判断当前Javascript运行环境是否支持async函数

文章原由

今天在学习Jasmine(一个Javascript的测试框架)中,在阅读文档时看到用来判断是否支持async函数的代码。javascript

// 获取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;
  }
复制代码

让咱们简化代码,基于上面的代码咱们能够将其合并成为一个函数java

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平台。如下是它的代码:node

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中使用它,你只需经过下述命令安装便可,目前使用文档已经更新好了,使用是否简单,你只需照着文档作就能够了。 文档地址:www.npmjs.com/package/is-…webpack

npm install --save is-async-await-supported
复制代码
相关文章
相关标签/搜索