如何向Promise.all()的入参数组中条件性添加符合要求的元素?
问题根因
你第二种写法的错误点在于:你将所有getFiles请求的Promise实例直接存入数组,Promise.all执行后只会返回所有请求的文件列表结果,没有建立请求结果和对应书籍ID的关联,也没有做筛选逻辑,所以得到的是所有书籍的查询结果,不是未备份的书籍ID。
正确实现方案
核心思路是先并行执行所有备份状态查询,关联每个查询结果对应的书籍ID,再按条件筛选出未备份的书籍,既保证了请求并行的性能,又能正确得到结果:
// 给每本书生成查询任务,返回书籍ID和备份状态 const backupCheckTasks = usersBooks.map(async (bookId) => { const files = await Util.file.getFiles(Util.file.DATA_BUCKET, { prefix: `${userId}/data/${bookId}/sqlite` }) return { bookId, notBackedUp: files.length === 0 } }) // 并行执行所有查询任务 const checkResults = await Promise.all(backupCheckTasks) // 筛选出未备份的书籍ID const booksNotBackedUp = checkResults .filter(item => item.notBackedUp) .map(item => item.bookId) console.log('booksNotBackedUp', booksNotBackedUp)
补充说明
for循环里写await不是完全禁止的规则:如果你的场景需要控制请求并发量(比如接口有频率限制,并行请求会触发限流),串行await的写法是完全可以用的,只是性能比并行请求低,按需选择即可。
内容的提问来源于stack exchange,提问作者A Developer
相关产品推荐
相关产品推荐

