Javascript 承诺中的“然后抓住”和“然后抓住”的区别

Javascript 承诺中的“然后抓住”和“然后抓住”的区别,javascript,node.js,Javascript,Node.js,这两者有什么区别?一个比另一个快吗?两者似乎都有效。请有人解释一下 没有承诺的人: client.query(query1) .then(data => { callback(null, { statusCode: 200, body: JSON.stringify(data) }); .catch(err => { callback(null, { statusCode: 500,

这两者有什么区别?一个比另一个快吗?两者似乎都有效。请有人解释一下

没有承诺的人:

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

});

让我们从这两个代码段的共同点开始。它们都调用了一些我们一无所知的
client.query()
函数,但是我们可以猜到它返回了一个实例。在剩下的答案中,我将假设这一点

这两者有什么区别

两者之间的区别在于它们如何返回异步操作的结果。前者使用回调,后者使用
Promise
,这不仅仅是回调。它提供状态(挂起/完成/拒绝)和支持。当然,您也可以进行连锁回调,但最终将不可避免地以失败告终。在第二个片段中,您可以返回原始承诺,但在我看来,将其包装在您自己的承诺中可能是一件好事,因为您正在抽象出返回原始承诺的结果

一个比另一个快吗

我不担心这件事。在异步编程中,它通常等待耗时最多的异步操作的结果。从性能的角度来看,您如何向调用者报告此类操作的结果的机制是不相关的。然而,异步编程中重要的是代码可读性和可维护性,即使使用承诺,这也可能不是最佳的。这导致我们在2017年推出了一款新产品


我不鼓励您直接使用异步函数。只要注意它,研究它,并在适当的时候使用它。

简单的答案是
,然后
总是返回一个
承诺。
当链中的任何承诺被拒绝时,它将执行第一个捕获。(在
中抛出错误,则
将返回被拒绝的承诺)

然后
将返回返回值的承诺(如果不是承诺),并在抛出错误时返回拒绝的承诺

因此,第一个也返回了
未定义的
承诺
,并且在性能上没有差异

const p1 = Promise.resolve('this will resolve');

p1.then((x) => Promise.resolve('You know: ' + x)).then(str => console.log(str));
p1.then((x) => Promise.reject('this will not resolve')).then(x => console.log('this will never execute')).catch(e => console.log('told you : ' + e));

p1.then((x) => 'You know: ' + x).then(str => console.log(str));
p1.then((x) => { throw 'this will not resolve' }).then(x => console.log('this will never execute')).catch(e => console.log('told you : ' + e));

这两种方法在then中做相同的事情。

如何
返回client.query(query1)。然后(data=>{return{statusCode:200,body:JSON.stringify(data)})