成功执行2个异步函数

时间:2017-08-21 06:30:56

标签: javascript jquery ajax

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

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

  1. 当我创建用户时
  2. 在第一个ajax的success:
  3. 这样调用是同步的。 我正在寻找一种更优雅的方式来预先形成这个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之前完成,但由于没有用户可以更新而失败。

1 个答案:

答案 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