jor*_*dan 5 javascript arrays loops promise bluebird
处理大量承诺的最有效方法是什么?我提出了2个解决方案,并确定解决方案2(使用bluebird的解决方案promise.map)更快。
解决方案1(每个文件约38ms)
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
}Run Code Online (Sandbox Code Playgroud)
解决方案2(每个文件约32ms)
_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
}Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以达到更高的效果呢?
小智 1
您可以使用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
})
}
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48 次 |
| 最近记录: |