await действителен только в асинхронной функции - eval в асинхронной - PullRequest
0 голосов
/ 17 мая 2019

Я хочу, чтобы eval () несколько строк кода внутри асинхронной функции.В то время как следующий код в порядке,

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

следующее выдает ошибку: await допустимо только в асинхронной функции

let ctxScript = 'await foo1(); await foo2();';
async function foo()
{
  eval( ctxScript );
}

Как я могу справиться с этим?Мой foo () должен быть асинхронным, так как это функция контроллера Puppetteer

Ответы [ 3 ]

3 голосов
/ 17 мая 2019

foo() не обязательно должно быть async, так как это не влияет на контекст выполнения eval.Вместо этого возможное решение - обернуть ваш ctxScript в самовыполняющуюся асинхронную функцию, например, так: eval("(async () => {" + ctxScript + "})()")

1 голос
/ 17 мая 2019

Если вы хотите динамически вызывать некоторый асинхронный код в какой-то более крупной функции, то вы можете предоставить обратный вызов, который сделает это за вас. Таким образом, вы можете вызывать свою функцию с различными дополнительными функциями, предоставляя ей различные функции обратного вызова для выполнения:

// some sample async functions
var resolveAfter2Seconds = function() {
  console.log("starting slow promise -> ");
  return new Promise(resolve => {
    setTimeout(function() {
      resolve("slow");
      console.log("<- slow promise is done");
    }, 2000);
  });
};

var resolveAfter1Second = function() {
  console.log("starting fast promise ->");
  return new Promise(resolve => {
    setTimeout(function() {
      resolve("fast");
      console.log("<- fast promise is done");
    }, 1000);
  });
};

//a function that accepts a callback and would await its execution
async function foo(callback) {
  console.log("-- some code --");
  await callback();
  console.log("-- some more code --");
}

//calling with an async function that combines any code you want to execute
foo(async () => { 
  await resolveAfter2Seconds();
  await resolveAfter1Second();
})
0 голосов
/ 17 мая 2019

Завершено, используя ответ Эрмира:

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