javascript等待多个异步ajax响应不起作用

时间:2018-07-13 05:17:32

标签: javascript ajax

我一直试图在异步模式下调用多个ajax调用,然后在继续操作之前等待所有ajax调用完成。 我正在使用jquery .when()。

var results_array = [];
var num = 0;
var promises = [];

    ldap_cmd_array.forEach(element => {
        var myldap = ldap_data;
        myldap.push({
            "name": "cmd",
            "value": element
        });
        console.log(++num);
        promises.push(ajaxCall(myldap, 'aaa',
            // success callback
            function (data) {
                console.log(--num);
                results_array.push(data);
                console.log('pass');
            },
            //error callback
            function (err) {
                //Do nothing
                console.log(--num);
                console.log('fail');
            }
        ));
    });
    $.when.apply($, promises)
      .then(function() {
        console.log(results_array);
    });

但是在输出中,我看到在所有ajax调用完成之前,results_array正在打印。我不确定我要去哪里。需要帮忙?预先感谢。

注意:已附加输出图像。

Chrome browser console output

2 个答案:

答案 0 :(得分:0)

最后,我能够解决它。 感谢Zim84,您的指针实际上解决了我的问题,鸣谢!

var results_array = [];
var num = 0;

var promises = [];
console.log(ldap_data);
ldap_cmd_array.forEach(element => {
    var myldap = ldap_data.slice(); //to copy a javascript object
    myldap.push({
        "name": "cmd",
        "value": element
    });
    var dObject = new $.Deferred();
    console.log(++num);
    promises.push(dObject);
    ajaxCall(myldap, 'taaa',
        // success callback
        function (data) {
            console.log(--num);
            dObject.resolve();
            results_array.push(data);
            console.log('pass');
        },
        //error callback
        function (err) {
            //Do nothing
            dObject.resolve();
            console.log(--num);
            console.log('fail');
        }
    );
});
$.when.apply($, promises)
    .then(function () {
        console.log('I should print after all promises');
        console.log(results_array);
    });

enter image description here

答案 1 :(得分:-2)

Promise.all([ajaxCall1, ..., ajaxCallN]).then(responseArray => {})