JavaScript Promise链式调用不符合预期:进入catch后仍抛出错误
问题原因
你当前的问题核心在于Promise实例一旦创建就会立即执行——你提前定义了promise2和promise3,它们在代码加载阶段就已经触发了reject逻辑,根本等不到链式调用走到对应的then分支。哪怕第一个catch捕获了promise2的错误,promise3早就已经抛出未被处理的异常了。
解决方法
要让Promise只有在链式调用走到对应步骤时才执行,有两种常用实现方式:
方式1:在then回调中动态创建Promise
把创建promise2和promise3的逻辑放到对应then回调内部,避免提前执行:
var promise1 = new Promise((resolve, reject) => resolve("1st resolved")); promise1 .then((res) => { console.log(res); // 走到该分支时才创建并执行promise2 return new Promise((resolve, reject) => reject("2nd rejected")); }) .then((res) => { console.log(res); // 走到该分支时才创建并执行promise3 return new Promise((resolve, reject) => reject("3rd rejected")); }) .then((res) => { console.log(res); }) .catch((err) => console.log("error in promise", err));
方式2:用函数包裹Promise创建逻辑
将每个Promise封装成函数,调用函数时才生成新的Promise实例,从根源避免提前执行:
function createPromise1() { return new Promise((resolve, reject) => resolve("1st resolved")); } function createPromise2() { return new Promise((resolve, reject) => reject("2nd rejected")); } function createPromise3() { return new Promise((resolve, reject) => reject("3rd rejected")); } // 链式调用时通过函数调用生成Promise createPromise1() .then((res) => { console.log(res); return createPromise2(); }) .then((res) => { console.log(res); return createPromise3(); }) .then((res) => { console.log(res); }) .catch((err) => console.log("error in promise", err));
修改后,所有Promise的异常都会被最后的catch统一处理:一旦前面的Promise触发reject,后续的then分支会直接跳过,不会触发后续Promise的执行,所有异常都会进入同一个catch块。
内容的提问来源于stack exchange,提问作者Soumya priyadarshi Das
相关产品推荐
相关产品推荐

