动态添加到promises数组时,保证所有提早完成

时间:2019-02-11 18:12:45

标签: javascript ecmascript-6 promise

此代码可以正常工作:

services.map(async svc => {
  promises.push(new Promise(async (resolve) => {
    html += `<h2>${svc}</h2>`;

    let journeyDetails = await admin.database().ref(`data`).once('value');

    resolve();
  }));
});

await Promise.all(promises).then(() => {
  return res.send(html);
})

为什么下面的代码不起作用?在我看来是一样的,但是执行顺序现在不正确。

Promise.all([
  services.map(async svc => {
    new Promise(async (resolve) => {
      html += `<h2>${svc}</h2>`;

      let journeyDetails = await admin.database().ref(`data`).once('value');

      resolve();
    })
  })
]).then(() => {
  // done - called before finished in this version
}).catch(() => {
  // err
});

1 个答案:

答案 0 :(得分:2)

我认为您的代码不起作用的主要原因是您将数组([services.map(...)])传递给Promise.all,而不是诺言的数组。

但是,代码过于复杂。无需在async函数内部创建诺言,async函数总是返回诺言。应该是:

Promise.all( // <- note the removed [...]
  services.map(async svc => {
    html += `<h2>${svc}</h2>`;
    let journeyDetails = await admin.database().ref(`data`).once('value');
    // more code here
  })
)