而井教你判斷當前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
複製代碼
相關文章
相關標籤/搜索