我有一个例子,我通过ajax调用创建一个新用户,创建用户后(服务器返回200),我立即用ajax再次更新它。
现在我可以用一种愚蠢的方式来做到这一点,我将 ajax 调用编写了两次:
- 当我创建用户时
- 第一个ajax的
成功:
内部
这样调用是同步的。
我正在寻找一种更优雅的方式来执行此 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
之前完成,但由于没有要更新的用户而失败。
最佳答案
不要使用for
循环;相反,使用先前调用的回调来开始下一个调用(请参阅 ***
行)。另请注意,$.ajax
没有 done
选项;有一个 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 移走
到成功
。
关于javascript - 成功后执行 2 个异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45790575/