我发现自己发明了一种使用jQuery承诺的模式,并想知道自己是否已经存在于其他地方。链接jQuery承诺通过回调
基本上,我有一个需要一个接一个地发生的异步操作链 - 但它们不一定是所有相同的操作,这些操作可能是有条件的。
它可能看起来像这样(CoffeeScript的语法简洁):
a = itemA.save()
a.done ->
b = itemB.fetch()
b.done ->
if x
c = itemC.fetch()
c.done ->
ui.showDone()
else
ui.showDone()
注意的丑陋:
- 过度嵌套
- 重复的代码
我的作文例行减少嵌套。在使用时,它看起来像这样:
chain = itemA.save()
chain = andThen chain, ->
itemB.fetch()
chain = andThen chain, ->
if x
itemC.fetch()
chain.always ->
ui.showDone()
凡andThen
看起来是这样的:
andThen = (promise, doneCallback) ->
result = $.Deferred()
promise.fail (value) ->
result.reject(value)
promise.done (value) ->
cbResult = doneCallback(value)
if cbResult && cbResult['done']
cbResult.done (value) ->
result.resolve(value)
cbResult.fail (value) ->
result.reject(value)
else
result.resolve(cbResult)
result.promise()
我可能重新发明轮子。但我还没有在其他地方找到这个轮子。它在哪里?
我主要使用promises来抽象出如显示错误消息,请求在飞行中时禁用按钮等事情。而不是使用promise来嵌入这些内联事物,我可以将承诺交给一个能够对持续行动的成功或失败做出反应的组件。它使UI更加一致和可组合。
这意味着我需要一个表示多个延期整个链的承诺 - 无论采取什么路径,这都将得到解决。
恭喜,那个车轮是承诺。 –
不,承诺不是方向盘;我已经使用承诺,'那么'是轮子;) –
阅读此:) https://gist.github.com/domenic/3889970 –