【发布时间】:2019-10-15 21:20:37
【问题描述】:
A) 请参阅下面的代码。
如果我使用// 1 行,我会调用onError 方法,那没关系。
但是如果我使用// 2 行(并注释掉// 1),那么onError 仍然会被调用,但也会出现未处理的拒绝错误。为什么?这迫使我像// 1 那样进行链接。如果我不进行链接但在原始承诺上调用catch,那么我会得到unhandled rejection error。
B) 为什么调用 p.then 和 p.catch 不返回原始承诺 p?我觉得这很奇怪。在我看到的所有允许链接的库中,返回原始对象(即this 对象)。在 JavaScript 中,当我们执行 promise1.then(...) 时,会返回一个新的 promise2,而不是 promise1。我觉得这很奇怪。这背后的逻辑推理是什么?对我来说,这似乎是一种不必要的复杂性,甚至是一种不好的做法。另一个gotcha 在使用JavaScript 时需要记住。但是好吧...我相信聪明人决定采用这种方法所以...这个决定背后的原因是什么?有任何想法吗?
function onSuccess () {
console.log('Success occurred!')
}
function onError () {
console.log('Error occurred!')
}
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
reject()
}, 2000)
})
var p1 = promise.then(onSuccess);
var p2 = p1.catch(onError); // 1 //
// var p2 = promise.catch(onError); // 2 //
console.log("DONE!");
【问题讨论】:
-
如果有人可以为这个问题建议一个更好的标题,我可以更改它。
-
为什么投反对票?这些都是非常有效的问题,并且高于中级 JavaScript 知识。这两个问题都是。
-
您可以链接
.then()s,然后继续对结果进行其他操作。如果.then()返回了原来的承诺,你就不能链接它们。 -
@ChrisG 哦...好吧...这很明显...我想这回答了我的第二个问题,谢谢。所以真的是这个原因……?第一个问题呢?
-
@ADyson 或者他没有找到他想要的答案,因此来到 SO 做我们都来这里做的事情 - 找到我们自己无法回答的问题的答案
标签: javascript promise