我發現自己發明了一種使用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 –