【问题标题】:Break Out of Function After Returning Promise - JavaScript [duplicate]返回承诺后打破功能 - JavaScript [重复]
【发布时间】:2016-10-05 00:58:06
【问题描述】:

当你有这样一个基于 Promise 的函数时:

function foo() {
  return new Promise(function(fulfill, reject) {
    // Do some async work, and then...
    console.log('a');
    fulfill('b');
    console.log('c');
  });
}

您会注意到c 将在fulfill 语句之后打印,这意味着该函数不会因fulfillreject 而中断。这很麻烦,因为大多数逻辑会假设函数应该在调用fulfill()reject() 后结束。

问题:
然后在fulfill()reject() 调用之前简单地添加return 是否安全或标准用法?

function foo() {
  return new Promise(function(fulfill, reject) {
    // Do some async work, and then...
    console.log('a');
    return fulfill('b');
    console.log('c'); //Does not get printed, as the function has ended execution. 
  });
}

// Call the function:
foo()
  .then(function(response) {
    console.log(response); //This is called once the function calls fulfill, will print 'b'
  });

这样使用 Promise 有什么问题吗?大多数在线承诺信息都没有提及在履行或拒绝之前使用return 语句。另外一个问题是,在使用thencatch 时,最常用的缩进方式是什么?

【问题讨论】:

  • 我看不出不这样做的理由,也许不是最佳实践但安全吗?是的。
  • 一般来说,是的,但你的具体例子没有意义。你不应该对同步任务使用 Promise,你应该删除 console.log('c') 而不是通过在前面的行中放置 return 使其成为死代码。
  • @Bergi 承诺示例只是一个示例,因此是同步任务。你读过这个问题吗?
  • @love:是的,我阅读了这个问题,并以(我希望)适当的副本结束了 :-) 关于“安全”,这与承诺无关,return 只是平常回调函数中的语义。
  • @Bergi,是的,对于适当的链接。我使用了安全这个术语,因为不确定隐式返回回调可能如何影响调用者/流控制。已经回答说没有区别或不利影响,并且确实应该在想要结束函数执行时使用。感谢大家的宝贵时间。

标签: javascript node.js promise


【解决方案1】:

一般来说,在 NodeJS 中,你不应该过多地使用 Promise 构造函数。

promise 构造函数用于converting APIs that don't return promises to promises。您应该考虑使用提供 promisification 的库(即使您全面使用原生 Promise),因为它提供了一种安全的替代方案,在错误处理逻辑中没有细微的错误。

自动承诺也相当快。

也就是说,您的问题的答案是“是”。

这样做是非常安全的,promise 构造函数没有什么特别之处——它们只是普通的 JavaScript。 Domenic 讨论了 Promise 构造函数 in his blog 的设计。

提前返回是完全安全的(就像任何其他函数一样) - 它实际上在常规异步函数中很常见。

(另外,在您的示例代码中,您应该只使用Promise.resolve,但我认为它很简单只是因为它是一个示例)。

【讨论】:

  • 感谢您的回答。您能否在两点上澄清或提供资源:1. automatic promisification 的速度如何快得多?它是如何在引擎盖下工作的? 2.你说使用Promise.resolve是什么意思对于我问题中的例子,你可以假设它是在fulfill()之前先做一些异步任务。再次感谢!
猜你喜欢
  • 2015-11-04
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 2014-05-21
  • 2016-10-20
  • 2018-06-03
  • 2015-02-13
相关资源
最近更新 更多