我在“ Angular 2”中有一个承诺问题。
请在下面查看我的代码:
getPromise1().then((result) => {
console.log("promise1 result");
}, (error) => {
console.log("promise1 error");
});
function getPromise1() {
return getPromise2().then((result) => {
console.log("promise2 result");
}, (error) => {
console.log("promise2 error");
});
}
function getPromise2() {
return new Promise((resolve, reject) => {
reject("error");
});
}
结果为:promise2 error
和promise1 result
。
我不知道为什么不promise2 error
和promise1 error
有什么问题和解决方案吗?
这是预览链接:http://plnkr.co/edit/RTc1wYfO8e1YPUrXM6GN
答案 0 :(得分:4)
当承诺被拒绝时,控件会跳至链中最接近的拒绝处理程序。
因此,这里.catch
块正常完成。因此,将调用下一个成功的处理程序。否则它可能会返回某些结果,就一样。
得出结果
结果是:
promise2 error
和promise1 result
。
因此,您可以根据需要设置多个.then,然后最后使用单个.catch来处理所有这些错误。
但是要获得以下结果
我不知道为什么不
promise2 error
和promise1 error
您需要重新引发错误
throw error;
.catch块在这里分析错误并再次抛出该错误:
function getPromise1() {
return getPromise2().then((result) => {
console.log("promise2 result");
}, (error) => {
console.log("promise2 error");
throw error;
});
}
答案 1 :(得分:1)
如果您处理任何promise链中的拒绝,那么这将使结果链得以实现,直到发现错误,然后它才被拒绝。考虑一下同步代码,您是否希望它能打印error A
和error B
?
function myFnA(){
throw new Error('A is bad');
}
function myFnB(){
try {
myFnA();
console.log('good A');
} catch(e){
console.log('error A');
}
}
function myFnC(){
try {
myFnB();
console.log('good B');
}
catch(e){
console.log('error B');
}
}
myFnC();
myFnB
修复了myFnA
错误。因此myFnB
的工作做对了。