为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯7119047 2021-06-18 18:52:48
这两者有什么区别?一个比另一个快吗?两者似乎都有效。有人请解释一个没有承诺的: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 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

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

这两者有什么区别?

两者之间的区别在于它们如何从异步操作返回结果。第一个使用回调,而后者使用 a Promise,这不仅仅是一个回调。它提供状态(待定/完成/拒绝)并支持链接。当然,您也可以链式回调,但它最终将不可避免地陷入回调地狱。在第二个片段中,您可以返回原始承诺,但在我看来,将其包装在您自己的承诺中可能是一件好事,因为您正在抽象出返回原始承诺的结果。

一个比另一个快吗?

我不会担心这件事。在异步编程中,它通常等待花费最多时间的异步操作的结果。从性能的角度来看,您如何向调用者报告此类操作的结果的机制是无关紧要的。然而,在异步编程中重要的是代码可读性和可维护性,即使您使用 Promise 也可能不是最佳的。这将我们引向 ES2017 中引入的异步函数

我不鼓励您立即使用异步函数。只要意识到它,研究它并在适当的时候使用。


查看完整回答
反对 回复 2021-06-24
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

简短的回答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 中都做同样的事情。


查看完整回答
反对 回复 2021-06-24
  • 2 回答
  • 0 关注
  • 224 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信