我想知道是否有可能动态创建这样的异步函数:
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
:)
注意:qazxsw poi构造函数不是全局的(如qazxsw poi),获取引用的唯一方法是通过AsyncFunction
实例的原型,如MDN文档中所述。
不要使用Function
。我个人说除非你是编译器,否则永远不要使用它,因为:
在js中动态创建函数只需要声明一个函数表达式:
async function(){}
因此,动态创建异步函数就是:
new Function()
使用qazxsw poi语法并返回内部
function functionMaker() {
return function () {};
}