【发布时间】:2014-07-06 02:18:26
【问题描述】:
我正在尝试等待 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)
在调用下一个 saveModel 之前,它实际上并没有等待 ajax 调用以其当前状态完成。它基本上只是按顺序为集合中的每个项目同步调用 saveModel 。对我所缺少的有什么想法吗?如果 $.Deferred 有更好的解决方案,我也可以。谢谢。
编辑:对不起,它的意思是在 saveModel 函数的最后一行说 saveModel。试图摆脱特定领域的部分。而且我使用的是打字稿,而不是咖啡稿
新尝试:
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();
});
【问题讨论】:
-
是coffescript 吗?如果是,请用它标记您的问题。
-
在哪里你把“下一个 saveModel”叫做?我唯一能看到的是
self.modelDeferred(…)。请提供一个完整的例子。 -
@Bergi:看起来更像 ES6 代码。
-
代码看起来应该可以按预期工作。如果您不熟悉承诺/延迟对象,请查看 learn.jquery.com/code-organization/deferreds 和 html5rocks.com/en/tutorials/es6/promises。
-
@FelixKling:这就是我问的原因。 Afaik,来自带有块体的 ES6 箭头函数,您需要明确地
return。当然,不管是什么语言,在箭头函数中使用self代替this没有多大意义。
标签: javascript jquery ajax recursion promise