簡體   English   中英

動態創建異步功能

[英]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() 我個人會說除非您是編譯器,否則不要使用它,因為:

  1. 它很丑
  2. 字符串中的代碼太酷了90年代..這很丑

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM