承诺和流量控制:提前退出

时间:2016-01-30 04:49:33

标签: javascript coffeescript q

我最近开始在coffeescript / javascript中编写承诺代码,我喜欢它。我不明白的一件事是如何使用promises处理流量控制。请考虑以下Q代码。

else:
      temp.append(item)

我想尽早回到来电者那里。这甚至可能吗?

我不想使用魔术异常进行流量控制。我需要做这样的事情还是有更好的方法?

outerFunction = ->
  Q()
    .then ->
      doSomethingAsync
    .then (result) ->
      return result if result is someSpecialValue 
      #do I really have to continue this chain or nest my promises in a new promise chain?
      ...
    .then ->
      ...
    .then ->
      ...

1 个答案:

答案 0 :(得分:3)

这是一个更完整的答案,无法返回来电者。因为Promise正在异步运行......换句话说,当承诺开始工作时,调用者已经返回了。因此,无法返回呼叫者,因为呼叫者已经离开。

如果您想退出承诺,只需致电this.reject()即可拒绝参数。它将陷入catch承诺。如果您不希望它再处理reject,您也可以从catch子句then catch。那么在某些时候,这将导致承诺失败。

它可能无法完全符合您的要求,因为您必须至少在最终catch处理错误,或者为什么您从承诺中提前离开。但即使是outerFunction = -> Q() .then -> doSomethingAsync .then (result) -> if error this.reject(result) return result if result is someSpecialValue .then -> ... .then -> ... .catch (error) -> console.log("Handling error", error) 也是一种承诺。

using

这里有关于承诺的更多文档:http://promisejs.org/这是一个很好的阅读。

我希望您理解outerFunction = -> Q() .then -> doSomethingAsync .then (result) -> if return_now return result if result is someSpecialValue return Q() .then -> ... .then -> ... .then -> ... 拒绝与尝试通过引发异常提前退出函数堆栈函数非常相似。我不鼓励这样做,因为它可能非常糟糕,很难理解它背后的逻辑。如果你必须尽早退出承诺,即使没有例外或错误,那么你可能不得不重新考虑你的流程。

你能做的就是这样做:

@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("test")
public class MyFancyTest {}

您可以返回结果或返回将继续处理链的承诺。