Promise.all找不到父Promise的解决

时间:2019-03-04 19:52:01

标签: javascript jquery promise

我有一个包含N个html选择的页面。我有一个名为“ run_all_ajax”的函数,该函数遍历它们并调用填充它们的ajax函数。我希望仅当Promise.all在其中完成时才能从run_all_ajax返回。

现在,控制台读取;

全部完成,0

毕竟完成

0,1,2,3等

意味着promise.all在我添加到promises数组之前就已经解决了。我该如何纠正?

此外,我想了解按时间顺序排列的诺言如何工作。我们是否假设我们可以遍历选择数组并将其添加到Promise数组中,比使用Promise.all()解决所有未完成的Promise更快?

function run_all_ajax() {

    return new Promise(function (resolve, reject) {
        var promises = [];

        $("[selectgrid]").each(function (i, obj) {

            $.ajax({
                //stuff
                success: function (response) {
                    //stuff
                    console.log(i);
                }, //end: success

                complete: function (jqXHR, textStatus) {//
                    promises.push(new Promise(function (resolve, reject) { resolve("Complete"); }));
                }
            }); //end: $.ajax

        });

        Promise.all(promises).then(function (values) {
            console.log('all done, ' + promises.length);
            resolve("Complete");  
        });
    }); //end promise
}

run_all_ajax().then(function(){
    console.log('after all done');
})

2 个答案:

答案 0 :(得分:1)

push在错误的位置(时间)做出了承诺。无需创建new Promise$.ajax()返回了您需要的承诺。

也是这样:

promises.push($.ajax({
    //stuff
}));

答案 1 :(得分:0)

promises.push是在完成Promise.all之后的请求完成时调用的。

基本上,您正在呼叫Promise.all([]),它会立即解决。

new Promise(function (resolve, reject) { resolve("Complete"); })

也会立即解决。等于Promise.resolve("Complete")