而井教你判斷當前Javascript運行環境是否支持async函數

文章起因

今天在學習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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章