如何让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
相关产品推荐
相关产品推荐

