Опитвам се да изчакам извикване на ajax, за да завърши записването на модел, преди да запиша следващия модел в списъка. Търсих в гугъл и видях някои неща за отложени обекти, които са нови за мен, и друг отговор, който имаше рекурсивна функция, го направи. Опитах рекурсивния метод, защото изглеждаше, че има малко повече смисъл, отколкото с отложени обекти и използване на $.when.apply($, arrayOfAjaxCalls).then()
. Така че този код (рекурсивният, изглежда така:
saveModel(index, numRequests) {
var self = this;
if (index < numRequests) {
var sample = self.samplesToSave[index];
return $.ajax({
url: model.url,
contentType: "application/json",
type: "POST",
data: JSON.stringify(model),
crossDomain: $.support.cors,
xhrFields: {
withCredentials: $.support.cors,
},
success: function(data) {
console.log("JUST SAVED");
console.log(data);
},
error: function(xhr: any) {
console.log(xhr);
},
}).then(() => {
self.saveModel(index + 1, numRequests);
});
}
}
Наричам това така:
saveModel(0, _.size(myCollection)
Всъщност не изчаква извикването на ajax да завърши в текущото си състояние, преди да извика следващия saveModel. По същество просто синхронно извиква saveModel за всеки елемент в колекцията по ред. Някакви мисли какво пропускам? Ако има по-добро решение с $.Deferred, аз също съм съгласен с това. Благодаря.
Редактиране: Съжалявам, че исках да кажа saveModel в последния ред на функцията saveModel. Опитваше се да се отърве от части, които бяха специфични за домейна. И използвам typescript, а не coffeescript
Нов опит:
saveSampleNew() {
var d = $.Deferred();
d.resolve();
var p = d.promise();
var self = this;
self.samplesToSave.forEach(sample => p = p.then(() => self.makeSaveRequest(sample)));
return p;
}
makeSaveRequest(sample) {
var self = this;
return $.ajax({
url: "samples",
contentType: "application/json",
type: "POST",
data: JSON.stringify(sample),
crossDomain: $.support.cors,
xhrFields: {
withCredentials: $.support.cors,
},
success: function(data) {
console.log("SAVED12");
console.log(data);
},
});
}
Тъй като този код зависи от завършването на други асинхронни извиквания, наричам този нов опит така:
this.saveContainers(project).then(() => {
}).done(() => {
self.saveSampleNew();
});
self.modelDeferred(…)
. Моля, предоставете пълен пример. - person Bergi   schedule 17.05.2014return
. Разбира се, няма много смисъл да използватеself
вместоthis
във функция със стрелка, независимо от езика. - person Bergi   schedule 18.05.2014return
, ако искате да върнете нещо ;) Първоначалната ми мисъл беше, че нещо трябва да се върне, но не знам как се нарича кодът като цяло, така че... не съм сигурен :-/ - person Felix Kling   schedule 18.05.2014return
от.then()
обещание за обратно извикване. В този случай ще трябва да върне рекурсивното обещание, в противен случай обещанието за връщане на първоначалното извикване би се разрешило твърде рано с тазиundefined
стойност. Тъй като не виждаме целия код, аз също не съм сигурен... - person Bergi   schedule 18.05.2014