Javascript 承诺链接多个错误
Javascript Promises Chaining Multiple Errors
为什么我所有已解决的回调都正确执行但仅
1 错误回调正在 运行 ?
在此处的示例中,如果 longOperation(true)
我只收到一个错误,而当 运行 为 false 时,我收到两条已解决的消息。在我的理解中,每个 .then
returns 一个新的承诺,它处于第二个 .then
错误回调注册的错误状态
此示例是使用 Typescript 编写的!
function longOperation(error) {
return new Promise < any > ((resolve, reject) => {
if (error) {
reject("Error")
} else {
setTimeout(function() {
resolve(true)
}, 1000)
}
})
}
let op = longOperation(true);
op
.then(result => {
console.log("Resolved #1")
}, undefined)
.then(result => {
console.log("Resolved #2")
}, undefined)
.then(undefined, error => {
console.log("Error1")
})
.then(undefined, error => {
console.log("Error2")
})
第一个错误处理程序捕获错误,就像常规的 catch
块一样。如果你想链式承诺被拒绝,你必须重新抛出错误:
Promise.reject().then(() => {
console.log(1);
}).then(() => {
console.log(2);
}).then(null, e => {
console.log(3);
throw e; // <= rethrow here
}).then(null, e => {
console.log(4);
});
承诺可以"recover".
错误将沿着“.then”链向下传播,直到找到错误回调。当它这样做时,它将执行错误回调并将 return 值传递给下一个 promise 的 resolve 方法。
所以只有下一个最接近承诺的错误回调才会被执行。
如果您想捕获链中所有可能的错误,只需将错误回调放在链的末尾,所有错误都将由它处理。
在您的代码示例中,您实际上创建了 5 个承诺。每个“.then”的原始 1 和 1。第二个和第三个只有一个 onResolved 方法,最后两个只有一个 onRejected 方法。
这是它将如何执行:
第一个承诺(op):我刚刚拒绝了。我看到我有一个没有 onRejected 回调的延迟承诺。所以我将调用它的 reject 方法,其值与我拒绝的值相同。
第二个承诺:之前的承诺调用了我的拒绝方法,我还有一个没有 onRejected 回调的延迟承诺。所以我将调用它的 reject 方法,其值与我拒绝的值相同。
第三个承诺:之前的承诺调用了我的拒绝方法。我也有一个延迟承诺,但我的确实有一个 onRejected 回调。我将使用我拒绝的值调用回调,我将使用回调的 return 值调用我的延迟承诺的 resolve 方法。
第四个承诺:之前的承诺调用了我的 resolve 方法。我有一个延迟的承诺,但它没有 onResolved 回调,所以我将使用我解析的值调用它的解析方法。
第五个承诺:之前的承诺调用了我的 resolve 方法。我决定了,什么也没做,因为我没有延期承诺。
为什么我所有已解决的回调都正确执行但仅 1 错误回调正在 运行 ?
在此处的示例中,如果 longOperation(true)
我只收到一个错误,而当 运行 为 false 时,我收到两条已解决的消息。在我的理解中,每个 .then
returns 一个新的承诺,它处于第二个 .then
错误回调注册的错误状态
此示例是使用 Typescript 编写的!
function longOperation(error) {
return new Promise < any > ((resolve, reject) => {
if (error) {
reject("Error")
} else {
setTimeout(function() {
resolve(true)
}, 1000)
}
})
}
let op = longOperation(true);
op
.then(result => {
console.log("Resolved #1")
}, undefined)
.then(result => {
console.log("Resolved #2")
}, undefined)
.then(undefined, error => {
console.log("Error1")
})
.then(undefined, error => {
console.log("Error2")
})
第一个错误处理程序捕获错误,就像常规的 catch
块一样。如果你想链式承诺被拒绝,你必须重新抛出错误:
Promise.reject().then(() => {
console.log(1);
}).then(() => {
console.log(2);
}).then(null, e => {
console.log(3);
throw e; // <= rethrow here
}).then(null, e => {
console.log(4);
});
承诺可以"recover".
错误将沿着“.then”链向下传播,直到找到错误回调。当它这样做时,它将执行错误回调并将 return 值传递给下一个 promise 的 resolve 方法。
所以只有下一个最接近承诺的错误回调才会被执行。
如果您想捕获链中所有可能的错误,只需将错误回调放在链的末尾,所有错误都将由它处理。
在您的代码示例中,您实际上创建了 5 个承诺。每个“.then”的原始 1 和 1。第二个和第三个只有一个 onResolved 方法,最后两个只有一个 onRejected 方法。
这是它将如何执行:
第一个承诺(op):我刚刚拒绝了。我看到我有一个没有 onRejected 回调的延迟承诺。所以我将调用它的 reject 方法,其值与我拒绝的值相同。
第二个承诺:之前的承诺调用了我的拒绝方法,我还有一个没有 onRejected 回调的延迟承诺。所以我将调用它的 reject 方法,其值与我拒绝的值相同。
第三个承诺:之前的承诺调用了我的拒绝方法。我也有一个延迟承诺,但我的确实有一个 onRejected 回调。我将使用我拒绝的值调用回调,我将使用回调的 return 值调用我的延迟承诺的 resolve 方法。
第四个承诺:之前的承诺调用了我的 resolve 方法。我有一个延迟的承诺,但它没有 onResolved 回调,所以我将使用我解析的值调用它的解析方法。
第五个承诺:之前的承诺调用了我的 resolve 方法。我决定了,什么也没做,因为我没有延期承诺。