Promise.all找不到Resolve for parent Promise

问题描述 投票:-1回答:2

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

现在,控制台读取;

全部完成,0

毕竟完成了

0,1,2,3等

意味着在我添加到promises数组之前,promise.all正在解析。我该如何纠正?

另外,我想了解承诺数组如何在时间方面起作用。我们是否假设我们可以遍历选择数组并将它们添加到promises数组中,而不是使用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');
})
javascript jquery promise
2个回答
1
投票

push在错误的地方(时间)承诺。没有必要创建一个new Promise。您需要的承诺由$.ajax()返回。

所以:

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

0
投票

在请求完成时调用promises.push,这是在执行Promise.all之后的方式。

基本上你打电话给Promise.all([])立即解决。

这个

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

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

© www.soinside.com 2019 - 2024. All rights reserved.