如何在返回Promise结果的同时关联返回额外值(无需从Promise内返回)
解决方案
要在不修改myFunc内部逻辑的前提下,将原对象与Promise执行结果关联,核心是在映射Promise时保留原对象的引用,待Promise resolve后再把结果合并到原对象中。
修改后的完整代码
let qq = [{keepme:"abcd",sql:"select top(1) * from X"}]; async function myFunc(sql:string){ return [{columnA:1,columnB:2}]; } async function run(){ // 映射时保留原对象,待Promise完成后合并结果 let prom = qq.map(item => myFunc(item.sql).then(result => ({ ...item, // 复制原对象的所有字段 resultOfPromise: result // 新增Promise结果字段 })) ); // 处理所有Promise的完成状态 const results = await Promise.allSettled(prom); // 提取成功的结果,同时处理失败的情况(可选) const finalData = results.map(res => { if (res.status === 'fulfilled') { return res.value; } else { // 若Promise失败,可自定义失败时的字段值 return { ...qq[results.indexOf(res)], resultOfPromise: null, error: res.reason }; } }); console.log(finalData); } run();
关键逻辑说明
映射阶段保留原对象:
不再直接返回myFunc(item.sql),而是通过.then()将Promise的结果与原对象合并,返回一个包含原所有字段+resultOfPromise的新对象。这样既不修改myFunc,又能关联原对象信息。处理Promise的所有状态:
使用Promise.allSettled可以同时处理成功和失败的Promise,避免单个Promise失败导致整体中断。根据状态分别处理:- 成功时直接返回合并后的对象
- 失败时可以保留原对象字段,并添加错误信息(按需调整)
输出结果
执行后控制台会输出符合需求的数组:
[{ keepme: "abcd", sql: "select top(1) * from X", resultOfPromise: [{columnA:1,columnB:2}] }]
内容的提问来源于stack exchange,提问作者Rilcon42
相关产品推荐
相关产品推荐

