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

在异步函数外部调用Promise结果出现Pending状态的问题求助

问题解决:Promise { } 异常处理

你遇到的问题核心是对Promise的异步特性理解不到位:promise.then()方法本身返回的还是一个Promise对象,而你在异步操作尚未完成时就打印了x,所以输出的是处于pending状态的Promise,而非最终的结果。

解决方案一:在then回调内处理结果

直接在then中获取并使用异步操作的结果,这是Promise最基础的用法:

let x;
const payload = {"Traffic":99,"Growth":9,"Transactions":9,"Weight":33};

let promise = new Promise((resolve, reject) => {
    decisionTable.execute_decision_table("Volumetrics", 
    decision_table,payload,  (err, results)  => {  
        if (err) {
            reject(err); // 必须处理错误,避免未捕获异常
            return;
        }
        resolve(results);   
    });
});

// 在then回调中获取结果并处理
promise.then(result => {
    x = result;
    console.log(x); // 这里会输出预期的JSON对象
    // 所有依赖x的操作都要放在这里或后续的then中
}).catch(err => {
    console.error("决策表执行失败:", err);
});

解决方案二:用async/await简化异步代码

如果你的运行环境支持ES2017+,可以用async/await让异步代码看起来更像同步代码,但注意await必须包裹在async函数内:

const payload = {"Traffic":99,"Growth":9,"Transactions":9,"Weight":33};

async function getDecisionResult() {
    try {
        const result = await new Promise((resolve, reject) => {
            decisionTable.execute_decision_table("Volumetrics", 
            decision_table,payload,  (err, results)  => {  
                if (err) reject(err);
                resolve(results);   
            });
        });
        console.log(result); // 直接拿到结果
        // 在这里使用result做后续逻辑
    } catch (err) {
        console.error("执行出错:", err);
    }
}

// 调用异步函数
getDecisionResult();

关键要点

  • Promise是异步操作的容器,异步操作完成前它会一直处于pending状态,不能同步直接获取结果
  • 所有依赖异步结果的代码,必须放在then回调或await之后的代码块中
  • 永远不要忽略错误处理,务必添加catch或try/catch来捕获异步操作中的异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:37:13