Вызов асинхронных IIFEs, синхронно - PullRequest
0 голосов
/ 03 марта 2019

У меня есть несколько IIFE, которые я хотел бы вызвать в определенном порядке:

Допустим, у меня есть следующие IIFE:

let foo1 = (async() => {
  await console.log('A')
  await console.log('B')
  await console.log('C')
})();

let foo2 = (async() => {
  await console.log('D')
  await console.log('E')
  await console.log('F')
})();

let foo3 = (async() => {
  await console.log('G')
  await console.log('H')
  await console.log('I')
})();

И я бы хотел вызвать их так:

foo1
foo2
foo3

... чтобы я мог получить следующий вывод:

A B C D E F G H I

Тем не менее, вывод, который я на самом деле получаю:

A D G B E H C F I

IЯ не уверен, почему это так, но я подозреваю, что это потому, что каждый раз, когда ожидание разрешает обещание, он вызывает следующую функцию в стеке.Как бы я вызвал их так, чтобы они выполнялись синхронно, и я получил желаемый результат?

1 Ответ

0 голосов
/ 03 марта 2019

Вы не хотите выполнять их синхронно.Вы хотите выполнить их асинхронно по порядку.Для этого вам нужно await один вызов, прежде чем делать следующий:

(async function() {
  let foo1 = await (async() => {
    //...
  })();

  let foo2 = await (async() => {
    //...
  })();

  let foo3 = await (async() => {
   //...
  })();
})();

Не имеет большого смысла await на console.log, однако, также не имеет смысла использовать несколькоAIIFE здесь вообще, вам нужен только один.

Я подозреваю, что это потому, что каждый раз, когда ожидание разрешает обещание, оно вызывает следующую функцию в стеке.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...