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

如何在返回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();

关键逻辑说明

  1. 映射阶段保留原对象:
    不再直接返回myFunc(item.sql),而是通过.then()将Promise的结果与原对象合并,返回一个包含原所有字段+resultOfPromise的新对象。这样既不修改myFunc,又能关联原对象信息。

  2. 处理Promise的所有状态:
    使用Promise.allSettled可以同时处理成功和失败的Promise,避免单个Promise失败导致整体中断。根据状态分别处理:

    • 成功时直接返回合并后的对象
    • 失败时可以保留原对象字段,并添加错误信息(按需调整)

输出结果

执行后控制台会输出符合需求的数组:

[{
  keepme: "abcd",
  sql: "select top(1) * from X",
  resultOfPromise: [{columnA:1,columnB:2}]
}]

内容的提问来源于stack exchange,提问作者Rilcon42

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:35:18