【问题标题】:NodeJS when to use promises? [closed]NodeJS 什么时候使用 Promise? [关闭]
【发布时间】:2016-09-07 20:33:40
【问题描述】:

这可能是基于一点意见,但一个重要的问题。

你应该只对异步操作使用 Promise 吗?如果你有一个 api,那么很可能那里的全部函数都应该使用 Promise。因此,如果我制作一些业务逻辑功能,它们也应该返回一个承诺。我想知道这是不是很好,你让一切都回报了一个承诺。我的意思是,我在 while 循环中调用函数,其中每个函数都返回一个 Promise(函数是链式的)。在函数中使用 Promise 会更慢吗?在堆栈中结合承诺和常规返回值是个好主意吗?我真的需要学习这个,所以请不要关闭

【问题讨论】:

  • 如果你的函数是异步的,它需要返回一个promise。如果它不做任何异步操作,它就没有充分的理由返回一个 Promise,你应该避免它。
  • 是的,但是您在另一个问题中回复评论说:“是的。“有时同步”是一个非常糟糕的主意,所以我们总是返回一个承诺。”当我说:“好的,所以可以从同步操作中返回一个 Promise。”看:stackoverflow.com/questions/38866725/…
  • 更多的是“当它发生在你不确定操作是否同步的上下文中时,可以从同步操作中返回一个承诺”
  • 有时同步和总是同步是有区别的。例如“我是否已经发出了这个极其缓慢的网络请求并缓存了结果?”否-> 提出请求并返回一个承诺。是->返回缓存的响应。现在你从同一个函数返回两个不同的东西。这是你总是会从“有时是同步的”函数返回一个承诺的地方,所以调用代码不需要关心它是否异步发生。
  • 简单问题:你会让String.substr异步吗?不,希望不会,因为这毫无意义。因此,您将总是拥有同步和异步代码的混合体,对于任何特定函数使用哪个代码取决于该函数应该做什么。

标签: javascript node.js promise es6-promise


【解决方案1】:

如果您的函数(有时)是异步的,它需要返回一个承诺。
如果你的函数从不做任何异步操作,那么它没有充分的理由返回一个 Promise,你应该避免它。保持简单和同步。

【讨论】:

  • 我可以将异步和同步函数链接在一起吗?例如:我想首先进行 api 调用,然后将其链接到 validateResponse 函数,如果其中任何一个有错误,那么我想捕获它。我可以做吗?使用 promise 会非常简单:sendQuery().then(validateResponse).then(transformResponse).catch(err...)。验证和转换函数是同步的,但它需要返回一个承诺以使链继续,并让捕获从所有这些函数中获取错误?另外,如果整个链在一个主要的 api 函数中,那应该返回一个承诺吗?
  • @VilleMiekk-oja:我有点知道你会问这个问题,所以我在上面发布了链接 :-) 是的,是的,是的,是的。
  • @VilleMiekk-oja then 不在乎它的回调是返回一个承诺还是纯值,无论如何它都会是Promise.resolve'd。您的.then(validateResponse).then(transformResponse) 有效。重新阅读您的评论后,我的第三个“是”可能应该是“否”,您不需要“需要返回一个承诺 [来自回调] 链继续”。
  • @VilleMiekk-oja 它应该像任何同步函数一样 throw 异常。 then 将捕获这些并将它们转化为拒绝,以便它完全按照您的预期工作。
猜你喜欢
  • 1970-01-01
  • 2010-09-20
  • 2012-09-19
  • 1970-01-01
  • 2013-05-25
  • 2010-09-06
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多