同步调用异步IIFE

时间:2019-03-02 22:29:07

标签: javascript function async-await

我想按特定顺序调用几个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

我不确定为什么会这样,但是我怀疑是因为每次等待解析一个Promise时,它都会调用堆栈中的下一个函数。我将如何调用它们,以便它们同步执行并获得所需的输出?

1 个答案:

答案 0 :(得分:4)

您不想同步执行它们。您想按顺序异步执行它们。为此,您必须await进行下一个通话,然后再进行下一个通话:

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

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

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

尽管在await上使用console.log并没有多大意义,但在这里使用多个AIIFE根本没有意义,那么,您只需要一个。

  

我怀疑是因为每当await解析一个promise时,它都会调用堆栈中的下一个函数。

这是一个队列,但基本上是。使用await总是会导致等待的表达式被包装到Promise中,并且Promises总是异步解析。因此,异步函数的执行停止,并且下一个函数继续从事件队列中出队并得到执行。