JavaScript中如何使用Promise.allSettled并行调用findOne查询用户
解决方案
核心实现逻辑:先整理所有需要查询的参数为数组,批量生成对应的findOne Promise实例,再传入Promise.allSettled即可实现并行执行,所有请求会在2秒后统一返回结果,不需要逐个等待。
完整修改后可运行代码
const findOne = (list, { key, value }) => { return new Promise ((resolve, reject) => { const element = list.find(element => element[key] === value); setTimeout(() => { element ? resolve(element.name) :reject(new Error('ERROR: Element not found')); }, 2000); }); } const users = [ { name: 'Carlos', rol: 'Teacher' }, { name: 'Ana', rol: 'Boss' } ]; console.log('批量并行查询用户开始'); async function fetchData(){ // 1. 整理所有需要查询的条件,可按需增删 const queryList = [ { key: 'name', value: 'Carlos' }, { key: 'name', value: 'Ana' }, { key: 'name', value: 'Bob' } // 不存在的用户,用于演示失败场景 ] // 2. 批量生成findOne Promise实例数组 const promiseList = queryList.map(query => findOne(users, query)) // 3. 传入allSettled并行执行所有查询 const results = await Promise.allSettled(promiseList) // 4. 遍历处理每个查询结果 results.forEach((result, index) => { const currentQuery = queryList[index] if (result.status === 'fulfilled') { console.log(`查询【${currentQuery.value}】成功:user: ${result.value}`) } else { console.log(`查询【${currentQuery.value}】失败:${result.reason.message}`) } }) } fetchData();
说明
- 返回的结果数组顺序和你传入的查询条件顺序完全对应,不会因为执行速度快慢打乱顺序
- 如果你需要只要有一个查询失败就终止所有处理,可以把
Promise.allSettled替换为Promise.all,但如果需要拿到每个查询的独立结果,allSettled更适配需求 - 可任意调整
queryList内的查询条件,没有数量限制,所有查询都会并行执行,总耗时固定为2秒,不会随查询数量增加而累加
内容的提问来源于stack exchange,提问作者A.Baes
相关产品推荐
相关产品推荐

