Jquery Promise и Deferred с возвращенными результатами

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

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;
    },

person jason    schedule 23.01.2016    source источник
comment
Проверьте функции functionX. Все они имеют одну и ту же синтаксическую ошибку.   -  person Andreas    schedule 23.01.2016
comment
нет необходимости заключать один $.ajax в $.when. Просто добавьте дополнительный код. $.ajax уже возвращает обещание   -  person charlietfl    schedule 23.01.2016
comment
Приведенный выше код является просто псевдокодом   -  person jason    schedule 23.01.2016


Ответы (1)


Поработав над этим некоторое время, я обнаружил, что это работает:

       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 ) {
        });
    },

Это гарантировало, что каждая функция, обернутая в метод .when, завершалась до того, как попадала в метод .done.

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

person jason    schedule 24.01.2016