如何在Promise.allSettled结果中关联对应ID与Promise引用
问题
现有如下JavaScript代码,使用Promise.allSettled批量请求API获取对应ID的对象,但无法将返回结果与原ID关联:
const ids = [1,10,33,40]; const promises = ids.map(id => getObjectById(id)) const result = await Promise.allSettled(promises) result.map(item => { if (item.status === 'fulfilled') { // 注:原代码拼写错误,应为fulfilled console.log(item.value) // 如何在此处获取该结果对应的原ID? } })
需求是找到能关联结果与原ID的方法,且实现性能最优。
最优性能实现:利用数组索引对应关系
Promise.allSettled返回的结果数组顺序,和原promises数组的顺序完全一致;而promises数组是通过ids数组map生成的,所以结果数组的索引与ids数组的索引天然一一对应。这种方式几乎无额外性能开销,是最优解:
const ids = [1,10,33,40]; const promises = ids.map(id => getObjectById(id)); const result = await Promise.allSettled(promises); result.forEach((item, index) => { const id = ids[index]; // 通过索引直接关联原ID if (item.status === 'fulfilled') { console.log('ID:', id, '数据:', item.value); } else { console.log('ID:', id, '请求失败:', item.reason); } });
备选方案:在Promise中包装ID与结果
如果需要更直观的关联逻辑,可以在生成Promise时,直接将ID和请求结果包装在一起返回:
const ids = [1,10,33,40]; const promises = ids.map(id => getObjectById(id) .then(data => ({ id, data })) .catch(err => ({ id, err })) ); const result = await Promise.allSettled(promises); result.forEach(item => { if (item.status === 'fulfilled') { const { id, data } = item.value; console.log('ID:', id, '数据:', data); } else { const { id, err } = item.value; console.log('ID:', id, '请求失败:', err); } });
这种方式逻辑更清晰,但会增加少量对象包装的开销,性能略逊于索引关联法。
注意事项
- 修正原代码的拼写错误:
fullfiled应为标准的fulfilled,否则无法正确判断Promise状态。 - 两种方案都不影响API请求的并行执行效率,并行请求的性能由浏览器/运行环境的并发限制决定,与关联逻辑无关。
内容的提问来源于stack exchange,提问作者gmilleo
相关产品推荐
相关产品推荐

