Is Promise.then(a, b) the same as Promise.then(a).catch(b)?
本问题已经有最佳答案,请猛点这里访问。
有什么区别
-
1myPromise.then(a, b)
-
1myPromise.then(a).catch(b)
?
无论
除了代码可读性之外,我是否应该更喜欢使用一个而不是另一个?
建议使用
看下面的例子:
即使我们
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | function asyncFun(a,b){ return new Promise((resolve, reject)=>{ if(typeof a ==="number" && typeof b ==="number") resolve(a + b); else reject("invalid data!!"); }); } asyncFun(2,'4').then((response)=>{ console.log(response); return response; }, (error)=>{ console.log(error); }).then((response)=>{ console.log("console 2",response) }, (error)=>{ console.log(error); }); |
如果我们在promise链的末尾只使用一个错误处理程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | function asyncFun(a,b){ return new Promise((resolve, reject)=>{ if(typeof a ==="number" && typeof b ==="number") resolve(a + b); else reject("invalid data!!"); }); } asyncFun(2,'4').then((response)=>{ console.log(response); return response; }).then((response)=>{ console.log("console 2",response) }).catch((err)=> console.log(err)); |
它们处理
例如,使用
1 2 3 4 5 | Promise.resolve('test') .then(r => { throw("whoops") }) .catch(e => console.log("caught error:", e)) |
使用
1 2 3 4 | Promise.resolve('test') .then(r => { throw("whoops")}, e => console.log("caught error?", e)) // unhandled rejection (you'll need to look in the console) |
除了一些测试场景之外,很难想到这种行为是首选的用例。
您可以同时使用两者,这将在
1 2 3 4 5 6 7 8 9 | Promise.reject("rejected") .then(r => {throw("whoops")}, e => console.log("Promise 1: caught error in second function:", e)) .catch(e=> console.log("Promise 1: caught error in catch", e)) Promise.resolve("rejected") .then(r => {throw("whoops")}, e => console.log("Promise 2: caught error in second function:", e)) .catch(e=> console.log("Promise 2: caught error in catch", e)) |
我认为,这两种方式是相同的。但是,我更喜欢使用
而且,如果你想逐个调用一些异步函数,但需要立即中断(不希望以下函数继续运行)如果抛出一些错误。你需要在决赛中只投入一次。在这种情况下,我们不能使用第一种风格。
1 2 3 4 5 | asyncA() .then((val) => asyncB(val)) .then((val) => asyncC(val)) .then((val) => asyncD(val)) .catch(() => { /* any of asyncA, asyncB, asyncC, asyncD will goes directly here if throwing error }) |
在上面的例子中。你可以看到,任何函数异步失败,程序将跳过以下函数并直接捕获。