javascript - 成功后执行 2 个异步函数

标签 javascript jquery ajax

我有一个例子,我通过ajax调用创建一个新用户,创建用户后(服务器返回200),我立即用ajax再次更新它。

现在我可以用一种愚蠢的方式来做到这一点,我将 ajax 调用编写了两次:

  1. 当我创建用户时
  2. 第一个ajax的成功:内部

这样调用是同步的。 我正在寻找一种更优雅的方式来执行此 ajax 调用,最好将 ajax 放在接收 urldata 值的函数内然后在第一次执行成功时调用自身。

这就是我现在拥有的:

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");
        }
    });
}

现在,updateUseraddNewUser 之前完成,但由于没有要更新的用户而失败。

最佳答案

不要使用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/

相关文章:

javascript - 如何将单个参数传递给自定义属性指令?

javascript - 我有一个通过 ajax 调用返回选择选项的表单,但是当我保存后值不会显示

javascript - 如何使用 jquery ui 调整新的事件/克隆元素的大小?

javascript - 获取 - 追加并查找具有类名的 div

javascript - 我可以安全地依赖仅对本地文件未定义的主机名(即导航到本地文件)吗?

javascript - 是什么让这个伪 GUID 生成器比 math.random() 更好?

Jquery传递变量到post没有表单?

ajax - ASP .NET MVC 3 - 如何提交嵌套在 html 表单中的 ajax 表单

javascript - 将 rowdata 标记从 javascript 传递到 servlet

javascript - Ajax 分页在使用分页替换页面内容时复制 _layout 页面