await Promise.all не ждет, несмотря на asyn c обертку - PullRequest
2 голосов
/ 05 марта 2020

Даже после прочтения нескольких ответов на похожие вопросы (например, это и то ) я, к сожалению, до сих пор не понимаю, почему этот код не ждет обещаний и, следовательно, регистрирует ['check2'] последний после других контрольных точек.

Это минимальный пример использования кода из этого руководства . В исходном коде мне нужно получить некоторую информацию из разных источников, прежде чем мой express сервер сможет начать прослушивание.

console.log("check1");

const resolveInTwoSeconds = () => {
  return new Promise((resolve) => {
    setTimeout(() => resolve("check2"), 2000);
  })
};
async function test() {
  const asyncFunctions = [
    resolveInTwoSeconds()
  ];
  const results = await Promise.all(asyncFunctions);
  console.log(results);

}
(async() => await test())();
console.log("check3");

РЕДАКТИРОВАТЬ: Представьте себе "check3", чтобы быть много кода, который зависит от побочных эффектов test (). Таким образом, я хочу запустить после печати check2 . Однако я использую await здесь, поэтому мне не нужно менять или перемещать «check3» .

Ответы [ 2 ]

2 голосов
/ 05 марта 2020

Эта строка кода объявляет функцию async и выполняет ее:

(async() => await test())();

Пока ничего не ждет его результат, и выполнение переходит к console.log("check3").

You придется явно его ждать:

await (async () => await test())();

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

(async () => {
  console.log("check1");

  const resolveInTwoSeconds = () => {
    return new Promise((resolve) => {
      setTimeout(() => resolve("check2"), 2000);
    })
  };
  async function test() {
    const asyncFunctions = [
      resolveInTwoSeconds()
    ];
    const results = await Promise.all(asyncFunctions);
    console.log(results);

  }
  await (async ()=> await test())();
  console.log("check3");
})()

В противном случае переведите check3 в уже существующую функцию async, как предлагали другие.

1 голос
/ 05 марта 2020

Это должно делать то, что вы хотите. вам нужно, чтобы console.log находился внутри функции asyn c.

console.log("check1");

const resolveInTwoSeconds = () => {
  return new Promise((resolve) => {
    setTimeout(() => resolve("check2"), 2000);
  })
};
async function test() {
  const asyncFunctions = [
    resolveInTwoSeconds()
  ];
  const results = await Promise.all(asyncFunctions);
  console.log(results);

}
(async() =>{ 
    await test();
    console.log("check3");
})();
...