Jquery Promise и Defered с возвращенными результатами
Я использую 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;
},
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/¶m1=' + param1;
return $.ajax({
url: url,
context: context,
beforeSend: function( xhr ) {
}
}).success(function( data ) {
});
},
Это гарантировало, что каждая функция, заключенная в метод.when, была завершена до перехода к методу.done.
надеюсь, это поможет кому-то еще.