2016-01-23 62 views
0

我正在使用Backbone.js,並且我有一些事件,這些事件產生Options對象的設置,這些事件發生在我的路由器中。被調用的視圖需要這些對象,因此它們必須在視圖創建之前完成。問題是發生的這些事件是ajax並且是異步的,所以它們在顯示視圖之前不會完成。我試圖讓這些事件同步,但這會導致其他問題,比如凍結gui。所以,我試圖鏈接我的函數,以便在所有函數被調用之前創建視圖。但是,這並不適合我,因爲我似乎無法弄清楚如何在防守呼叫之間傳遞數據。以下是我有:Jquery Promise和與返回結果相關

Router.js:

someParentFunction:function(paramA, paramB){ 
    var that = this; 
    var defer1 = $.when(
     $.get(that.functionA('somedata1','somedata2',that)) 
    ); 
     defer1.done(function() { 
      var defer2 = $.when(
       $.get(that.functionB('someData',that)) 
     ); 
      defer2.done(function (data) { 
       var defer3 = $.when(
       $.get(that.functionC('somedata1',that)) 
       ); 
       defer3.done(function (data) { 
       //how do I get the results from each Deferred function? 
       //keeling in mind that each deferred function 
       //also receives parameters. 
       //also, the order of the other functions does not matter, 
       //as long as they all return their values before this 
       //view is created. 
       that.view = new ProjectView({ 
        someParam1:paramA, 
        someParam2:paramB,      
        resultsA: jQuery.parseJSON(defer1.results), 
        resultsB: jQuery.parseJSON(defer2.results), 
        resultsC: jQuery.parseJSON(defer3.results), 

       }), 

       window.app.page(that.view, { 
         tab:'someName',       
       }) 

       }); 
      }); 

     }); 
} 

functionA: function(param1, param2){ 
    var url = '?q=somestring&' + param1 + '&' + param2 ; 
    return $.ajax({ 
      url: url, 
      context: context, 
      beforeSend: function(xhr) { 
      ); 
      } 
      }).success(function(data) {    
      }).responseText; 
    }, 
functionB: function(param1, context){ 
    var url = '?q=somestring&' + param1 ; 
    return $.ajax({ 
      url: url, 
      context: context, 
      beforeSend: function(xhr) { 
      ); 
      } 
      }).success(function(data) {    
      }).responseText; 
    }, 
functionC: function(param1, context){ 
    var url = '?q=somestring&' + param1; 
    return $.ajax({ 
      url: url, 
      context: context, 
      beforeSend: function(xhr) { 
      ); 
      } 
      }).success(function(data) {    
      }).responseText; 
    }, 
+0

檢查'functionX'函數。它們都有相同的語法錯誤。 – Andreas

+1

不需要在'$ .when'中包裝一個'$ .ajax'。只需添加額外的代碼。 '.ajax'已經返回一個承諾 – charlietfl

+0

上面的代碼只是僞代碼 – jason

回答

0

在這一段時間的工作後,這是我找到的工作:

 var that = this 
     $.when(
      that.functionA(param1,that) , 
      that.functionB(param1,that) , 
      that.functionC(that) , 
      that.functionD(param1,that) , 
      that.functionE(param1,that) , 
      that.functionF(param1,that, param2) 
     ).done(function(a1, a2 , a3, a4, a5, a6) { 
      var response1 = jQuery.parseJSON(a1[0].result.results); 
      var response2 = jQuery.parseJSON(a2[0].result.results); 
      var response3 = jQuery.parseJSON(a3[0].result.results); 
      var response4 = jQuery.parseJSON(a4[0].result.results); 
      var response5 = jQuery.parseJSON(a5[0].result.results); 
      var response6 = jQuery.parseJSON(a6[0].result.results); 

      that.view = new MyView({ 
       someParam:param1, 
       anotherParam:param2,      
       r1: response1, 
       r2: response2, 
       r3: response3, 
       r4: response4, 
       r5: response5, 
       r6: response6 
      }), 

      window.app.page(that.view, { 
       tab:'someValue',   
      }) 
    }); 

然後每個函數結構像這樣:

functionA: function(param1, context){ 
     var url = '?q=myApp/api/general_functions/&param1=' + param1; 
     return $.ajax({ 
      url: url, 
      context: context, 
      beforeSend: function(xhr) { 
      } 
     }).success(function(data) { 
     }); 
    }, 

這確保了每個函數wr在.when方法中應用,在使用.done方法之前完成。

希望這可以幫助任何人。