2 回答

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

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 中都做同样的事情。
添加回答
举报