然后捕获和一个捕获内的承诺之间的区别

时间:2019-06-09 12:37:02

标签: javascript node.js

两者之间有什么区别?一个比另一个快吗?两者似乎都起作用。有人请解释

一个没有承诺的人:

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);
    });

});

2 个答案:

答案 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

这两种方法在那时都做同样的事情。