3 回答
TA贡献1785条经验 获得超8个赞
foo()
不一定是async
,因为这对 的执行上下文没有影响eval
。相反,一个可能的解决方案是将您的 ctxScript 包装在一个自执行的异步函数中,如下所示:eval("(async () => {" + ctxScript + "})()")
TA贡献2016条经验 获得超9个赞
最终使用了 Ermir 的回答:
let ctxScript = '(async () => {await foo1();await foo2();is_script_ended = true; })();';
async function foo()
{
// a lot of code
is_script_ended = false;
eval( ctxScript );
while(!is_script_ended){ await sleep(1000); }
// a lot of code
}
TA贡献1831条经验 获得超10个赞
如果您希望能够等待评估,您可以使用:
await Object.getPrototypeOf(async function() {}).constructor("your code here")();
这使用AsyncFunction构造函数。MDN 上有一个页面描述了使用它和使用之间的区别eval:
注意:使用 AsyncFunction 构造函数创建的异步函数不会为其创建上下文创建闭包;它们总是在全局范围内创建。
运行它们时,它们只能访问自己的局部变量和全局变量,而不能访问调用 AsyncFunction 构造函数的范围内的变量。
这与将 eval 与异步函数表达式的代码一起使用不同。
这意味着,如果您希望评估代码能够访问变量,则需要将它们添加到globalThis:
const testVar = "Hello world";
globalThis["testVar"] = testVar;
const result = await Object.getPrototypeOf(async function() {}).constructor(`
console.log(testVar);
await myAsyncFunc();
return testVar;
`)();
// result will be "Hello world"
delete globalThis["testVar"];
添加回答
举报