我最近开始在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 ->
...
答案 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 {}
您可以返回结果或返回将继续处理链的承诺。