在解析promise之前运行多个ajax调用

时间:2017-07-11 00:43:58

标签: javascript ajax es6-promise

我有一个函数可以调用ajax并使用结果解析一个promise。不幸的是,API将结果限制为100,我需要使用偏移参数来获得下一个100,依此类推。在解决承诺之前,如何进行所有需要的ajax调用(API响应提供值的总数,以便我可以确定要调用的调用次数)?

这是我用来获得前100个然后解决的函数:

    let currentOffset = 0;
    let totalCount;
    let offsetCount;

 const makeCall = function(camp) {
        return new Promise(function(resolve, reject) {
            api.get(camp, currentOffset, e => {
                totalCount = e.totalCount;
                offsetCount = Math.floor(totalCount / 100)
                let payload = e.payload;
                for (var a in payload) {

                    myArray.push({
                        'id': payload[a].id,
                        'text': payload[a].text,
                        'url': ads[a].url,
                    });
                }
                resolve();
            });
        });
    };

2 个答案:

答案 0 :(得分:1)

执行此操作的最佳方法是为每个ajax调用创建一个Promise,然后使用Promise.all()确定所有请求何时成功。

类似下面的代码段。只有在所有呼叫成功后,此承诺才会解决。请记住,如果任何ajax请求失败,它将永远无法解决,因此可能值得添加一些东西来处理它。

order

答案 1 :(得分:1)

您可以使用第一个调用来确定选项的数量,然后创建所需数量的ajax调用以获取其余值以及每个ajax调用的相应承诺。一旦所有其他ajax调用完成,解决第一个承诺。这部分可以使用Promise.all()完成。

let currentOffset = 0;
let totalCount;
let offsetCount;

const makeCall = function(camp) { 
    // Repeat the below for each ajax request
    return new Promise(function(resolve, reject) {
        let apiPromises = [];

        api.get(camp, currentOffset, e => {
            totalCount = e.totalCount;
            offsetCount = Math.floor(totalCount / 100)
            let payload = e.payload;
            for (var a in payload) {

                myArray.push({
                    'id': payload[a].id,
                    'text': payload[a].text,
                    'url': ads[a].url,
                });
            }

            for (var numCalls = 1; numCalls < offsetCount; numCalls++) {
                // Increment currentOffset here
                apiPromises.push(new Promise(function() {
                    api.get(camp, currentOffset, e => {
                        // Add each value to array
                    }
                }
            }

            Promise.all(apiPromises).then(resolve);
        });
    });
};

有一些细节要填写,但这应该有它的要点。