You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:23:25