【问题标题】:javascript wait for multiple async ajax response is not workingjavascript等待多个异步ajax响应不起作用
【发布时间】:2018-07-13 05:17:31
【问题描述】:

我一直在尝试以异步模式调用多个 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);
    });

但在输出中,我看到 results_array 在所有 ajax 调用完成之前打印。我不确定我哪里出错了。需要帮忙?提前致谢。

注意:输出图像已附加。

Chrome browser console output

【问题讨论】:

标签: javascript ajax


【解决方案1】:

最后我能够解决它。 感谢 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);
    });

【讨论】:

  • 感谢大家花费宝贵的时间来帮助我。你们是很棒的人。谢谢!!
  • 这太复杂了。 $.ajax 已经返回了一个承诺。改用那个。如果ajaxCall返回了$.ajax返回的promise,那么你的代码可以是Promise.all(ldap_cmd_array.map(element => { /*... */ return ajaxCall(myldap, 'taaa').catch(() => null); })).then(results_array => console.log(results_array));,不需要创建延迟对象或使用回调。
【解决方案2】:
Promise.all([ajaxCall1, ..., ajaxCallN]).then(responseArray => {})

【讨论】:

  • 为了调用函数,您必须在参数列表周围使用括号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 2019-10-21
  • 2020-12-03
  • 2023-04-07
相关资源
最近更新 更多