繁体   English   中英

在解决诺言之前运行多个ajax调用

[英]run multiple ajax calls before resolving a promise

我有一个函数可以进行ajax调用并用结果来解决promise。 不幸的是,API将结果限制为100,我需要使用offset参数来获取下一个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();
            });
        });
    };

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

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

let currentOffset = 0;
let totalCount;
let offsetCount;

const makeCall = function(camp) {
    let apiPromises = [];

    // Repeat the below for each ajax request
    apiPromises.push(
    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();
        });
    }));

    return Promise.all(apiPromises);
};

您可以使用第一个调用来确定选项的数量,然后创建所需数量的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);
        });
    });
};

有一些细节需要填写,但是应该有要点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM