文章起因
今天在學習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