javascript - 处理大量 promise 的最有效方式?

标签 javascript arrays loops promise bluebird

处理大量 promise 的最有效方法是什么?我提出了 2 个解决方案并确定 解决方案二 (使用 Bluebird 的 promise.map )更快。

解决方案一 (每个文件约 38 毫秒)

readFile(file) {
  return new Promise((resolve, reject) => {
    jsmediatags.read(file, {
      onSuccess: resolve,
      onError: reject
    })
  })
}

async readFilesHandler() {
  console.time('readFilesHandler timer')
  const fileArray = Array.from(this._fileSelectInput.files)
  const tracksArray = []

  for (let file = 0; file < fileArray.length; file++) {
    await this._readFile(fileArray[file]).then(tags => {
      tracksArray.push({
        id: file + 1,
        title: tags.tags.title || undefined,
        artist: tags.tags.artist || undefined,
        album: tags.tags.album || undefined,
        year: tags.tags.year || undefined
      })
    })
  }
  this.dispatchEvent(new CustomEvent('tracks-selected', {
    detail: tracksArray
  }))
  console.time('readFilesHandler timer') // ~38ms/file
}


解决方案二 (每个文件约 32 毫秒)

_readFiles() {
  console.time('_readFiles timer')
  const fileArray = Array.from(this._fileSelectInput.files)

  window.Promise.map(fileArray, file => {
    return new Promise((resolve, reject) => {
      jsmediatags.read(file, {
        onSuccess: resolve,
        onError: reject
      })
    })
  }, {
    concurrency: 5
  }).then(tags => {
    const results = tags.map((tag, index) => ({
      id: index + 1,
      title: tag.tags.title || undefined,
      artist: tag.tags.artist || undefined,
      album: tag.tags.album || undefined,
      year: tag.tags.year || undefined
    }))
    this.dispatchEvent(new CustomEvent('tracks-selected', {
      detail: results
    }))
  })
  console.timeEnd('_readFiles timer') // ~32ms/file
}


有没有更高效的实现相同结果的方法?

最佳答案

您可以使用 Promise.allSettled()
整个 Promise 数组的解决速度与解决最慢的单个 Promise 的速度一样快。

const bucket = await Promise.allSettled(fileArray.map(file => this._readFile(file)))

bucket.forEach(file => {
  if (file.value) {
    const tags = file.value;
    tracksArray.push({
      id: file + 1,
      title: tags.tags.title || undefined,
      artist: tags.tags.artist || undefined,
      album: tags.tags.album || undefined,
      year: tags.tags.year || undefined
    })
  }
})

关于javascript - 处理大量 promise 的最有效方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59012018/

相关文章:

javascript - 如何正确检测 iframe 加载响应 204 No Content?

javascript - $http GET 刷新页面

java - 如何将数组从 java android Activity 类传递到普通 java 类?

c - C中不同文件中写入数据

javascript - 将内部 `[(ngModel)]` 用于通用控件?

javascript - 如何将字符串数组转换为另一个数组

arrays - 在 Swift 2.0 中有没有一种方法可以从数组的某个索引开始一个 tuple-for-loop?

php - 返回的数组让我很困惑

java - 确定一个数字数组是否可以分为两个数组,每个数组包含相同的数字总和

linux - Bash脚本在文件结束后循环