我是处理promises的新手,并注意到,为了在嵌套的promises链中捕获错误,我需要在链中的每个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);
});
};
答案 0 :(得分:2)
与提及的@ bugwheels94一样,您可以在print
内返回您的承诺,并在之前.then
之外添加另一个.then
。此外,.then
可以带2个参数 - 第二个用于捕获错误。用文字解释有点困难所以这是一个例子。
.then
编辑:@ jfriend00带来了使用所有这些poll.pollForCandidates()
.then((candidates) => {
let clientId = candidates[0].clientId;
return poll.getUnprocessedCandidates({context, clientId, candidates})
.then((unprocessedCandidates) => {
console.log(unprocessedCandidates);
return poll.addCandidatesToQueue(context, unprocessedCandidates)
}, (error) => {
console.log(error);
})
.then((processedCandidates) => {
console.log(processedCandidates);
return poll.addCandidatesToTable(processedCandidates)
}, (error) => {
console.log(error);
})
.then((result) => {
console.log(result);
}), (error) => {
console.log(error);
});
})
.catch((error) => {
console.log(error);
});
方法的好处。以下是链末尾的单个.catch
代码的样子。
.catch
编辑2 :删除这些额外的poll.pollForCandidates()
.then((candidates) => {
let clientId = candidates[0].clientId;
return poll.getUnprocessedCandidates({context, clientId, candidates})
.then((unprocessedCandidates) => {
console.log(unprocessedCandidates);
return poll.addCandidatesToQueue(context, unprocessedCandidates)
})
.then((processedCandidates) => {
console.log(processedCandidates);
return poll.addCandidatesToTable(processedCandidates)
})
.then((result) => {
console.log(result);
});
})
.catch((error) => {
console.log(error);
});
语句可让您更清晰。
console.log
答案 1 :(得分:1)
这是更短的方法:
poll.pollForCandidates()
.then((candidates) => poll.getUnprocessedCandidates({ context, candidates[0].clientId, candidates }))
.then((unprocessedCandidates) => poll.addCandidatesToQueue(context, unprocessedCandidates))
.then((processedCandidates) => poll.addCandidatesToTable(processedCandidates))
.then(console.log)
.catch(console.error);
说明:
这被称为撰写承诺,它是承诺的伟大超级大国之一。只有在前一个承诺解决后才会调用每个函数,并且可以使用该承诺的输出调用它。
在then函数中你可以做三件事:
在上面的示例中,我们返回一个承诺,因此我们可以使用.then
继续撰写承诺。
最后,console.log
获得结果并使用它调用console.log
。 (与console.error
相同)
那就是它。一旦你理解了这个技巧,你就会理解承诺。
您可以在此处继续阅读: We have a problem with promises - By: Nolan Lawson