2016-01-23 2 views
0

Я использую Backbone.js, и у меня есть несколько событий, которые создают параметры для объекта Options, которые встречаются в моем маршрутизаторе. Представление, которое вызвано, нуждается в этих объектах, и поэтому они должны завершиться до создания представления. Проблема состоит в том, что эти события, которые происходят, являются ajax и являются асинхронными, поэтому они не заполняются до отображения представления. Я попытался сделать события синхронными, но это вызывает другие выпуски, например, замораживание gui. Итак, я пытаюсь связать свои функции так, чтобы представление создавалось до тех пор, пока не будут вызваны все функции. Но это не работает для меня, поскольку я не могу понять, как передавать данные между отсроченными вызовами. Вот что у меня есть:JQuery обещание и отложенное с возвращенными результатами

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

нет необходимости обертывать один '$ .ajax' в' $ .when'. Просто добавление дополнительного кода. '$ .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 apped в методе .when, завершенном до того, как перейти к методу .done.

надеюсь, что это поможет кому-либо еще.