【发布时间】:2017-12-13 16:14:06
【问题描述】:
我是使用 Promise 的新手,我注意到,为了在嵌套的 Promise 链中捕获错误,我需要在链中的每个 Promise 上调用 catch 方法。有没有更简洁的方法来写这个?
poll.pollForCandidates().then((candidates) => {
let clientId = candidates[0].clientId;
poll.getUnprocessedCandidates({context, clientId, candidates})
.then((unprocessedCandidates) => {
console.log(unprocessedCandidates);
poll.addCandidatesToQueue(context, unprocessedCandidates)
.then((processedCandidates) => {
console.log(processedCandidates);
poll.addCandidatesToTable(processedCandidates)
.then((result) => {
console.log(result);
})
.catch((error) => {
console.log(error);
});
})
.catch((error) => {
console.log(error);
})
})
.catch((error) => {
console.log(error);
})
})
.catch(() => {
console.done(error);
});
};
【问题讨论】:
-
哦不!我记得这是一个很常见的反模式。从
.then返回承诺。并且下一个.then处理程序将具有返回的承诺的已解决/拒绝值 -
我认为“异步”库会是更好的方法。你试过异步瀑布吗?
-
使用
await。但是使用您现有的代码,您还可以删除除最后一个之外的所有.catch(error => console.done(error)调用。他们什么都不做。 -
几乎所有这些
.catch()陈述都是错误的,原因有几个。您应该链接您的语句,并且只在您实际需要处理错误的地方放置一个.catch()。另外,这些.catch()语句只记录并且不返回任何内容实际上将承诺从拒绝更改为履行,这可能不是您想要的。
标签: javascript ecmascript-6 promise