【发布时间】:2017-06-20 04:00:38
【问题描述】:
我很难理解将 .catch BEFORE 和 AFTER then 放入嵌套承诺之间的区别。
备选方案 1:
test1Async(10).then((res) => {
return test2Async(22)
.then((res) => {
return test3Async(100);
}).catch((err) => {
throw "ERROR AFTER THEN";
});
}).then((res) => {
console.log(res);
}).catch((err) => {
console.log(err);
});
备选方案 2:
test1Async(10).then((res) => {
return test2Async(22)
.catch((err) => {
throw "ERROR BEFORE THEN";
})
.then((res) => {
return test3Async(100);
});
}).then((res) => {
console.log(res);
}).catch((err) => {
console.log(err);
});
每个函数的行为如下,如果数字是<0,test1 失败如果数字是> 10,test2 失败,如果数字不是100,test3 失败。在这种情况下 test2 只是失败了。
我尝试运行并让 test2Async 失败,然后 BEFORE 和 AFTER 的行为方式相同,并且没有执行 test3Async。有人可以向我解释将捕获物放在不同地方的主要区别吗?
在每个函数中我console.log('Running test X') 以检查它是否被执行。
这个问题的出现是因为我之前发布的帖子How to turn nested callback into promise?。我认为这是一个不同的问题,值得发布另一个主题。
【问题讨论】:
-
.then 和 .catch 都可以改变承诺......所以我不确定误解来自哪里。如果你把 catch 放在 .then 之前,它会捕获在 .then 之前发生的拒绝,.then 将根据 .catch 中发生的情况运行它的完成/失败回调,当你交换它们时反之亦然。跨度>
-
对不起,如果我的问题不清楚。但在这种情况下,正如我所说,两种情况的行为相同,所以我看不出区别。你能告诉我我们什么时候把它放在之前,什么时候我们决定把它放在之后?把它放在后面似乎真的很直观和常见。只是不知道为什么有时我们把它放在那之前
-
如果他们的表现相同,那只是因为在这种特定情况下,他们所做的并不会改变结果。任何一个的微小变化都可能改变结果。
-
“改变结果”是什么意思。对不起,我真的很困惑哈哈
-
例如,如果你什么都不做而不是抛出错误,promise 将从被拒绝切换到被解决。这当然会改变结果,因为这个承诺现在是一个已解决的承诺,而不是一个被拒绝的承诺。 (当然除非它已经解决了,在这种情况下,catch 无论如何都不会运行)
标签: javascript node.js promise bluebird