我想按特定顺序调用几个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时,它都会调用堆栈中的下一个函数。我将如何调用它们,以便它们同步执行并获得所需的输出?
答案 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总是异步解析。因此,异步函数的执行停止,并且下一个函数继续从事件队列中出队并得到执行。