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

如何让promo()等待内部第二个Promise执行完成后再对外决议

问题根因

你在.then()回调中创建了第二个Promise,但没有将其作为返回值抛出,Promise链式调用的规则是:如果.then()的回调函数返回一个Promise对象,那么链式调用后续的.then()/.catch()/.finally()都会等待这个返回的Promise决议后才会执行。你原来的代码没有返回第二个Promise,.then()默认返回undefined包装的fulfilled状态Promise,所以外层回调直接执行,不等第二个定时器结束。

修复方案

只需要在第二个Promise前面加return关键字即可,修改后的完整代码如下:

promo()
    .then((e) => console.log("finished everything"))
    .catch((e) => console.log("failed everything"))
    .finally(() => console.log("done")); // 补充说明:finally回调本身不接收参数,原代码的e会是undefined,这里做了合理性修正

function promo() {
    console.log("awaiting promise");
    return new Promise((resolve, reject) => {
        setTimeout((e) => {
            console.log("done with first promise");
            resolve("done");
        }, 2000);
    }).then((e) => {
        console.log("starting second promise");
        // 新增return语句,让链式调用等待当前内部Promise执行完成
        return new Promise((resolve) => {
            setTimeout((e) => {
                console.log("done with second promise");
                resolve("done2");
            }, 2000);
        });
    });
}
验证输出

修改后的运行结果完全符合你的预期:

awaiting promise
done with first promise
starting second promise
done with second promise
finished everything 
done 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:51:03