await is only valid in async function - eval in async

前端 未结 4 1894
北海茫月
北海茫月 2020-12-17 23:59

I want to eval() some lines of code inside of async function. While the following code is ok,

async function foo()
{
  await foo1();
  await foo2();
}
         


        
4条回答
  •  孤城傲影
    2020-12-18 00:42

    If you want to be able to await the eval you can use this:

    await Object.getPrototypeOf(async function() {}).constructor("your code here")();
    

    This uses the AsyncFunction constructor. MDN has a page on it which describes the differences between using it and using eval:

    Note: async functions created with the AsyncFunction constructor do not create closures to their creation contexts; they are always created in the global scope.

    When running them, they will only be able to access their own local variables and global ones, not the ones from the scope in which the AsyncFunction constructor was called.

    This is different from using eval with code for an async function expression.

    This means that if you have variables that you want your evaled code to be able to access, you need to add them to 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"];
    

提交回复
热议问题