而井教你判斷當前Javascript執行環境是否支援async函式

RIOLI發表於2019-02-16

文章起因

今天在學習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

相關文章