我有以下代码:
var p1 = Q($.ajax({
url: "/api/test1"
}));
p1.then(function () {
console.log("success1");
});
p1.then(function () {
throw "some error";
console.log("success2");
});
p1.then(function () {
console.log("success3");
});
p1.catch(function () {
console.log("failure1");
});
p1.catch(function () {
console.log("failure2");
});
p1.finally(function () {
console.log("finally1");
});
p1.finally(function () {
console.log("finally2");
});
我期待以下输出假设我从api / test1获得一些数据 - " success1,failure1,failure2,finally1,finally2"
我真正得到的是 " success1,success3,finally1,finally3"
" Success3"令我感到困惑的是 - 为什么代码会在发生异常时传播到第二个?
我如何编写此代码以便能够捕获当时部分中可能出现的任何异常?
TA
答案 0 :(得分:0)
“Success3”显示的原因是因为你的承诺没有被束缚
基本上,“然后”调用(以及“捕获”和“最终”)是彼此相互依赖的。如果您将其视为树结构,则它们都是p1
承诺的子项。如果你想让他们依赖,他们就会有一个孩子,孙子,曾孙等关系。如果你想把它们连在一起,你可以做类似的事情:
var p1 = Q($.ajax({
url: "/api/test1"
}));
p1.then(function () {
console.log("success1");
}).then(function() {
throw "some error";
console.log("success2");
}).catch(function () {
console.log("failure");
});
在每个函数运行后,这基本上是隐式返回promise。随后的“then”(或catch / finally)将应用于该(隐式)返回值。