2014-06-12 84 views
0

我發現自己發明了一種使用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更加一致和可組合。

這意味着我需要一個表示多個延期整個鏈的承諾 - 無論採取什麼路徑,這都將得到解決。

+2

恭喜,那個車輪是承諾。 –

+0

不,承諾不是方向盤;我已經使用承諾,'那麼'是輪子;) –

+0

閱讀此:) https://gist.github.com/domenic/3889970 –

回答

1

我可能重新發明了方向盤。但我還沒有在其他地方找到這個輪子。它在哪裏?

它甚至有一個類似的名字:.then()方法!實際上它是promisesmain idea

itemA.save().then -> 
    itemB.fetch() 
.then -> 
    if x 
    itemC.fetch() 
.always -> 
    ui.showDone() 
+0

我閱讀並重新閱讀文檔,然後確信它是幾乎沒有區別,除了在管道被棄用後添加的一些過濾邏輯。但現在回過頭來看,回調函數返回的「可觀察」對象將被正確組合。 –