在返回所有承诺值之前,我如何等待所有承诺解决?

时间:2019-11-18 00:34:58

标签: javascript promise bluebird

我正在使用bluebird中的Exception: Prelude.Enum.().toEnum: bad argument。我正在尝试等待所有的承诺都解决,然后再调度包含对象数组的事件。

Promise.map

我遇到了readFiles() { const fileArray = Array.from(this.fileSelectInput.files) const promises = [] window.Promise.map(fileArray, (file, index) => { return window.jsmediatags.read(file, { onSuccess: tag => { promises.push({ id: index + 1, title: tag.tags.title || undefined, artist: tag.tags.artist || undefined }) promises.sort((a, b) => a.id - b.id) console.log('I should be first') } }) }).then(() => { console.log('I should be second') this.dispatchEvent(new CustomEvent('tracks-selected', { detail: promises })) } }之前将I should be second打印到控制台的问题。事件调度的I should be first包含一个空数组。

1 个答案:

答案 0 :(得分:1)

您可能正在寻找

const fileArray = Array.from(this.fileSelectInput.files);

window.Promise.map(fileArray, file => {
  return new Promise((resolve, reject) => {
    window.jsmediatags.read(file, {
      onSuccess: resolve,
      // also pass reject as an error handler if jsmediatags supports that
    });
  });
}).then(tags => {
  const results = tags.map(tag => ({
    id: index + 1,
    title: tag.tags.title || undefined,
    artist: tag.tags.artist || undefined
  }));
  // results.sort((a, b) => a.id - b.id) - not necessary given .map() keeps the order
  this.dispatchEvent(new CustomEvent('tracks-selected', {
    detail: results
  }))
});