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

问题描述 投票:0回答:1

我正在使用bluebird的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打印到控制台的问题。事件调度的detail: promises包含一个空数组。

javascript promise bluebird
1个回答
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
  }))
});
© www.soinside.com 2019 - 2024. All rights reserved.