我有一个案例,我通过ajax调用创建一个新用户,在创建用户后(服务器返回200),我立即用ajax再次更新它。
现在我可以用愚蠢的方式做到这一点,我写了两次ajax调用:
success:
内这样调用是同步的。
我正在寻找一种更优雅的方式来预先形成这个ajax调用,最好是ajax
在一个接收url
和data
值的函数内,然后在第一次执行时调用自身成功的。
这就是我现在所拥有的:
var requests = [
{url: 'addNewUser', data: ''},
{url: 'updateUser', data: ''}
];
requests[0].data = JSON.stringify(formData);
formData.roles = "4,2,30";
requests[1].data = JSON.stringify(formData);
for(var k=0;k<requests.length;k++){
$.ajax({
type: "POST",
url: apiURL + requests[k].url,
contentType: "application/json",
data: requests[k].data,
success: function(data) {
console.log(data + " success");
},
error: function(data) {
console.log("error " + data);
},
done: function(data) {
console.log(data + " success");
}
});
}
现在,updateUser
在addNewUser
之前完成,但由于没有用户可以更新而失败。
答案 0 :(得分:1)
不要使用for
循环;相反,使用先前调用的回调来开始下一个调用(请参阅***
行)。另请注意,done
没有$.ajax
选项;您可以在done
结果上调用$.ajax
函数,但对于我们在下面使用的内容,我们需要complete
选项:
var requests = [
{url: 'addNewUser', data: ''},
{url: 'updateUser', data: ''}
];
requests[0].data = JSON.stringify(formData);
formData.roles = "4,2,30";
requests[1].data = JSON.stringify(formData);
var k = 0;
doOne(); // ***
function doOne() { // ***
if (k >= requests.length) {
return;
}
$.ajax({
type: "POST",
url: apiURL + requests[k].url,
contentType: "application/json",
data: requests[k].data,
success: function(data) {
console.log(data + " success");
},
error: function(data) {
console.log("error " + data);
},
complete: function(data) { // ***
console.log(data + " complete");// ***
++k; // ***
doOne(); // ***
}
});
}
如果您只想在早期通话成功时继续“循环”,请将++k;
和doOne();
来电从complete
移至success
。