首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Do / While XMLHttpRequest将所有调用的结果添加到一个数组

Do / While XMLHttpRequest将所有调用的结果添加到一个数组
EN

Stack Overflow用户
提问于 2020-01-31 18:30:43
回答 1查看 77关注 0票数 1

我需要使用类似于&page=N的标记遍历N个页面,从这些页面获取特定的I,最后还需要在本地存储中添加对象持有的最终数组中缺少的值。

由于可能有超过100页或更多的页面,所以我不能只执行For或do / While循环,因为所有的请求都会同时发生,使服务器不堪重负。

无论如何,我找到了一个解决方案,在触发另一个请求之前等待一个请求的完成。它如预期的那样工作(不过我觉得这是一个巨大的解决方案,而不是一个好的解决方案)。

问题是,我希望每个请求将结果数组连接到一个“主数组”,该数组包含所有页面的所有结果,我想将其与本地存储中的结果进行比较,只在所有请求运行之后。这不会发生的..。对每个请求这样做更有意义吗?

下面是代码:

代码语言:javascript
运行
复制
function getUserRatings() {
    storage.get("userID", function(result) {
        if (!isEmpty(result)) {
            var pageNo = 1
            var finalArr = [];
            do {
                (function(cntr) {
                    let resp = requestRatings("https://www.page.com/user/" + result["userID"] + "/info/page-" + pageNo.toString() + "/");
                    resp.then((successMessage) => {
                        finalArr.concat(successMessage);
                        console.log("requestJSON(JSONURL) finished ", successMessage);
                        console.log("finalArr ongoing = ", finalArr);
                    });
                    pageNo++;
                })(pageNo);
            }
            while (pageNo <= 7); // temporary - need to replace this with sth like 'while any of the values in the returned array are not found in local storage array
        }
    });
}

function requestRatings(url) {
    console.log("requesting ratings");
    return new Promise(function (resolve, reject) {
        var xhr = new XMLHttpRequest();
        xhr.open('get', url);
        //xhr.setRequestHeader('Content-Type', 'application/json');
        xhr.onload = function () {
            var status = xhr.status;
            if (status == 200) {
                var rspns = xhr.responseText;
                var doc = new DOMParser().parseFromString(rspns, "text/html");
                //console.log(doc);
                var ratedList = doc.querySelectorAll('a[class~="specificClass"]');
                var arr = Array.prototype.map.call(ratedList, function (e) {return e.getAttribute('href').replace(/(?:.*?stuff\/|-[^$]+)/gm, '')});
                //console.log(arr);
                resolve(arr);
            } else {
                reject(status);
            }
        };
        xhr.send();
    });
}

我认为可以解决的是function(cntr),我也怀疑这是导致数组不连接的原因。

尽管do / while循环之外声明了finalArr变量,但它没有被更新(可能是因为concat发生在单独的函数中?)。

以下是我想要实现的全面解决办法:

  • 循环一个接一个地遍历页面,以避免压倒服务器
  • 捕获数组,如果返回数组中的任何值已经存在于保存在本地存储中的数组中,则停止循环(对页面上的数据进行排序,因此如果遇到一个现有值,这意味着在此之后的所有值都已经存储,并且不需要将返回的数组刮到主数组( again)
  • Concat
  • )中,从本地存储数组中删除已经在本地存储数组中的值,
  • 将更新的主数组附加到本地存储数组

中。

编辑:我知道了如何一个一个地处理http请求。不幸的是,请求没有按顺序运行。有什么办法吗?

EN

回答 1

Stack Overflow用户

发布于 2020-02-02 11:29:31

我发现了这一点,它帮助我处理顺序的http请求-递归- https://stackoverflow.com/a/55282152/4017077

我是如何设置的:

从response

  • Concat获得响应

  • 获取所需的in数组存储数组

  • 删除重复项(这是在保存所有in之后,再次检查第一页(使用最新in))

  • 将其保存到本地存储区

H 112如果存储数组中没有in,则从函数内部再次调用函数,其值H 213F 214

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60009423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档