2014-01-16 38 views
0

我有幾個Backbone.js模型,我想要獲取,然後在所有提取完成後調用回調函數。一個模型必須在其他模型之前獲取,以取消id。我現在就像是:jQuery當沒有等待所有延遲解決

doFetch: (model) -> 
    model.set('first_model_id', @firstModel.get('id')) 
    model.fetch() 

doAsyncStuff: (callbackFn) -> 
    $.when(
     @firstModel.fetch() 
    ).done(=> 
     $.when(
      @doFetch @secondModel, 
      @doFetch @thirdModel 
     ).done(=> 
      callbackFn() 
     ) 
    ) 

問題是callbackFn是@secondModel之前被調用和@thirdModel取得到解決。如果我將一個doFetch調用的結果賦值給一個局部變量,並在調用callbackFn之前查看它的狀態,它通常會被「解析」,但有時仍然是「待定」。爲什麼內心在等待所有這些電話解決?

+1

我不知道CoffeeScript的,但是,當我該腳本轉換爲JS,我看到一個奇怪的現象。你的內在時間是這樣寫的:'$ .when(_this.doFetch(_this.secondModel,_this.doFetch(_this.thirdModel)))。done(function(){'這看起來不像你想要的格式。注意第三個模型的dofetch是如何在第二個模型的調用之內的,這導致內部只有等待第二個模型完成,而不是第三個模型。 –

回答

0

你是內部關閉時的語法,它導致第三個doFetch作爲第二個參數完成。用這種方式重寫它似乎解決了這個問題。我也轉向。然後,因爲我認爲這使得在這種情況下更乾淨的代碼。

doFetch: (model) -> 
    model.set('first_model_id', @firstModel.get('id')) 
    model.fetch() 

doAsyncStuff: (callbackFn) -> 
    $.when(
     @firstModel.fetch() 
    ).then(=> 
     $.when(
      @doFetch @secondModel 
      @doFetch @thirdModel 
     ) 
    ).done(=> 
     callbackFn() 
    ) 

我只是刪除逗號後@doFetch @secondModel