如何将Promise.all()返回结果与每个Promise对应的ID关联
实现方案
核心逻辑是:Promise.all返回的结果顺序和传入的Promise数组顺序完全一致,你可以利用这个特性匹配layer的ID,更直接的方式是在创建每个请求Promise时就提前将ID和返回结果绑定。
修改后的完整代码
const promises = []; const layers = req.body.layers; const raw = "some data"; layers.forEach(layer => { const requestOptions = { method: 'POST', body: raw, headers: { 'Content-Type': 'application/json' } }; // 每个请求Promise完成后直接返回绑定了ID的结果 const layerPromise = fetch(layer.url, requestOptions) .then(response => response.json()) // 把当前layer的id和返回数据打包成对象 .then(data => ({ id: layer.id, data: data })); promises.push(layerPromise); }); Promise.all(promises) .then(resultArr => { // resultArr里的每一项都已经是{id:xxx, data:xxx}的结构,直接返回即可 return res.send({ error: false, success: true, response: resultArr }) }) .catch(err => { return res.send({ error: err.message, success: false }) })
可选优化:兼容单个请求失败的场景
如果需要避免单个请求失败导致整个Promise.all直接报错中断,可以给每个请求加单独的错误捕获:
const layerPromise = fetch(layer.url, requestOptions) .then(response => response.json()) .then(data => ({ id: layer.id, success: true, data: data })) .catch(err => ({ id: layer.id, success: false, error: err.message }));
这样即使单个请求失败,也只会在对应ID的项里标记错误,不会影响其他请求的结果返回。
内容的提问来源于stack exchange,提问作者ca5p3r
相关产品推荐
相关产品推荐

