两者之间有什么区别?一个比另一个快吗?两者似乎都起作用。有人请解释
一个没有承诺的人:
client.query(query1)
.then(data => {
callback(null, {
statusCode: 200,
body: JSON.stringify(data)
});
.catch(err => {
callback(null, {
statusCode: 500,
body: JSON.stringify(err)
});
});
其他有希望的人
return new Promise((resolve, reject) => {
client.query(query2)
.then(data => {
resolve({statusCode:200, body: JSON.stringify(data)});
})
.catch(err => {
reject(err);
});
});
答案 0 :(得分:2)
让我们从这两个代码段的共同点开始。它们都调用一些我们不了解的client.query()
函数,但是我们可以猜测它返回了一个Promise实例。我将在其余的答案中假定这一点。
这两者有什么区别?
两者之间的区别在于它们如何从异步操作返回结果。第一个使用回调,而第二个使用Promise
,而不仅仅是一个回调。它提供状态(未决/已实现/已拒绝)并支持chaining。当然,您也可以使用链式回调,但是不可避免地会以callback hell结尾。在第二个片段中,您可能已经返回了原始的承诺,但是在我看来,将其包装在您自己的承诺中可能是一件好事,因为您正在提取结果以返回原始的承诺。
一个比另一个快吗?
我不会为此事担心。在异步编程中,通常要等待花费大量时间的异步操作结果。从性能的角度来看,将这种操作的结果报告给呼叫者的机制是无关紧要的。但是,在异步编程中重要的是代码的可读性和可维护性,即使您使用promises,也可能不是最佳的。这就引出了ES2017中引入的async functions。
我不鼓励您立即使用异步功能。只是要意识到它,研究它并在适当的时候使用。
答案 1 :(得分:1)
简短的回答是list
总是返回then
。
当链中的任何承诺被拒绝时,它将执行第一个捕获。 (在Promise
中抛出错误将返回被拒绝的承诺。)
then
如果不是promise,将返回返回值的promise,如果引发错误,则返回被拒绝的promise。
所以第一个也返回then
的{{1}},并且在性能上没有差别,
Promise
这两种方法在那时都做同样的事情。