承诺中 then catch 和 then catch 之间的区别

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


一个没有承诺的:


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

    });


});


幕布斯7119047
浏览 225回答 2
2回答

翻过高山走不出你

让我们从这两个代码片段的共同点开始。它们都调用了一些client.query()我们一无所知的函数,但是我们可以猜测它返回一个Promise实例。我将在其余的答案中假设这一点。这两者有什么区别?两者之间的区别在于它们如何从异步操作返回结果。第一个使用回调,而后者使用 a Promise,这不仅仅是一个回调。它提供状态(待定/完成/拒绝)并支持链接。当然,您也可以链式回调,但它最终将不可避免地陷入回调地狱。在第二个片段中,您可以返回原始承诺,但在我看来,将其包装在您自己的承诺中可能是一件好事,因为您正在抽象出返回原始承诺的结果。一个比另一个快吗?我不会担心这件事。在异步编程中,它通常等待花费最多时间的异步操作的结果。从性能的角度来看,您如何向调用者报告此类操作的结果的机制是无关紧要的。然而,在异步编程中重要的是代码可读性和可维护性,即使您使用 Promise 也可能不是最佳的。这将我们引向 ES2017 中引入的异步函数。我不鼓励您立即使用异步函数。只要意识到它,研究它并在适当的时候使用。

MMMHUHU

简短的回答then总是返回 a Promise。当链中的任何承诺被拒绝时,它将执行第一个捕获。(在其中抛出错误then将返回一个被拒绝的承诺)。then 如果它不是一个承诺,将返回一个返回值的承诺,如果抛出错误,则返回一个被拒绝的承诺。所以第一个也返回 a Promiseof undefined,性能没有区别,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 中都做同样的事情。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript