У меня проблема, когда у меня есть три вызова Ajax, которые мне нужно сделать, чтобы получить некоторые строки. Если какой-либо из них не работает, вместо этого мне нужно использовать строку по умолчанию. Я хочу, чтобы моя страница подождала, пока все строки не будут разрешены (или отклонены), прежде чем двигаться дальше.Как я могу быть уверенным, что группа отложенных дней решена или отклонена, прежде чем продолжить?
То, что я до сих пор выглядит примерно так:
var myObj = {
initialize: function(){
// Start fetching this stuff right away
var that = this;
this.promise1 = $.ajax(url: 'url1').then(function(result){
that.string1 = result
).fail(function(){
that.string1 = 'string1Default';
});
this.promise2 = $.ajax(url: 'url2').then(function(result){
that.string2 = result
).fail(function(){
that.string2 = 'string2Default';
});
this.promise3 = $.ajax(url: 'url3').then(function(result){
that.string3 = result
).fail(function(){
that.string3 = 'string3Default';
});
}
getStrings: function(){
return {
string1: this.string1,
string2: this.string2,
string3: this.string3
};
}
doThingWithStrings: function(callback){
var that = this;
return $.when(this.promise1, this.promise2, this.promise3)
.always(function(){callback(that.getStrings())})
}
}
myObj.initialize(); // start fetching
// ... do some other stuff
myObj.doThingWithStrings(loadThePageWithStrings);
Есть две проблемы с этим. Один из них заключается в том, что он просто чувствует себя тяжелее, чем должно быть.
Вторая важная проблема заключается в том, что $ .when выполняет .done(), когда все были разрешены, но .fail(), как только все были отклонены. То, что мне действительно нужно, - это то, что выполняется после того, как все обещания уже не ожидаются, успешно ли они были решены или были отклонены. $. Кажется, почти, но не совсем, что я хочу. Я не хочу показывать страницу, пока я не извлечу (или не смог получить) каждую из трех строк. Как я могу это сделать?
После дополнительных исследований (я обещаю, я посмотрел, прежде чем я это написал!) Я думаю, что, может быть, это дубликат [this] (http://stackoverflow.com/questions/6538470/jquery-deferred-waiting-for-multiple-ajax-requests-to-finish/13627555#13627555) – Sterno