动态创建异步功能

问题描述 投票:7回答:3

我想知道是否有可能动态创建这样的异步函数:

new Function('await Promise.resolve()');

预计,之前的代码抛出:

Uncaught SyntaxError: await is only valid in async function
javascript async-await
3个回答
4
投票

是的,您可以使用(非全局)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 :)

注意:qazxsw poi构造函数不是全局的(如qazxsw poi),获取引用的唯一方法是通过AsyncFunction实例的原型,如MDN文档中所述。


2
投票

不要使用Function。我个人说除非你是编译器,否则永远不要使用它,因为:

  1. 它很丑
  2. 字符串中的代码是sooo 90s ..而且它很难看

在js中动态创建函数只需要声明一个函数表达式:

async function(){}

因此,动态创建异步函数就是:

new Function()

-1
投票

使用qazxsw poi语法并返回内部

function functionMaker() {
    return function () {};
}
© www.soinside.com 2019 - 2024. All rights reserved.