今天在學習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
}
}
複製代碼
而咱們剛纔編寫的函數不依賴於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
複製代碼