[英]Dynamically create async function
我想知道是否可以動態創建這樣的異步函數:
new Function('await Promise.resolve()');
可以預期,先前的代碼將拋出:
Uncaught SyntaxError: await is only valid in async function
是的,您可以使用(非全局) AsyncFunction構造函數以與new Function(...)
相似的方式動態創建異步函數。
這是一個簡單的示例:
const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor;
function createAsync(){
return new AsyncFunction('a', `return new Promise((resolve) => {
setTimeout(() => {resolve(a)}, 1000)
});`);
}
let asyncFn = createAsync();
asyncFn(1).then(/* chain the promise */);
// or inside some async function
async function myFunction(){
await asyncFn(1);
}
記住,您可以在動態創建的異步函數中使用await
:)
注意: AsyncFunction
構造函數不是全局的(就像Function
是一樣的),對其引用的唯一方法是通過async function(){}
實例的原型,如MDN文檔中所述。
不要使用new Function()
。 我個人會說除非您是編譯器,否則不要使用它,因為:
在js中動態創建函數只需要聲明一個函數表達式:
function functionMaker() {
return function () {};
}
因此,動態創建異步函數很簡單:
function asyncMaker() {
return async function () {};
}
使用new Function()
語法在內部返回
async function foo() { return await new Promise(next => { setTimeout(()=> next('hello there!!'), 3000) }) } var new_async = new Function(`return ${foo.toString()}`)() console.log(new_async.toString())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.