意外的Promise.all,带有嵌套地图承诺

时间:2018-12-01 05:31:21

标签: javascript ecmascript-6 es6-promise

3秒后,我需要利用array.map()显示数组的一些消息。这是数组:

const messages = [
    'hello', 'world', 'have', 'some', 'code'
]

为了在地图上等待,我创建了一个wait函数。

const wait = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve(true)
    }, 3000)
})

然后,我有一个app方法,在其中执行了这样的Promise.all()

const app = async () => {
    await Promise.all(messages.map(async msg => {
        await wait
        document.querySelector('#app').innerHTML += msg + ', '
    }))
}

app()

预期的输出是在消息数组上的映射的每次迭代中等待3秒,但是它将在3秒后立即输出所有消息!

Codepen:https://codepen.io/rakibtg/pen/xQMwYK

我在这里想念什么?

1 个答案:

答案 0 :(得分:0)

Promise.all()可用于传递承诺列表,所有承诺都将并行等待。

您共享的代码每次迭代确实要等待3秒钟,除了所有这些迭代都同时发生。

如果您不想并行执行所有操作,而一次只处理一个,则可以将其重写为一个简单的循环:

const app = async () => {
  for (const msg of messages) {
    await wait();
    document.querySelector('#app').innerHTML += msg + ', '
  }
}