do / while XMLHttpRequest 将所有调用的结果添加到一个数组中



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

由于可能有一百多页或更多,我不能只执行 For 或 Do/While 循环,因为所有请求都会同时发生,使服务器不堪重负。

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

问题是我希望每个请求都将结果数组连接到所有抓取页面的所有结果的"主数组",我想仅在所有请求运行后将其与本地存储中的内容进行比较。而且它没有发生...根据请求执行此操作是否更有意义?

代码如下:

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),我也怀疑这是我遇到数组未连接问题的原因。

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

.

以下是我想要实现的完整解决方案:

  • 逐个循环浏览页面,以免使服务器不堪重负
  • 捕获请求返回的数组
  • 如果返回数组中的任何值已存在于保存在本地存储中的数组中,请停止循环(页面上的数据已排序,因此如果我遇到现有值,则表示该值之后的所有值都已存储并且不需要再次抓取(
  • 返回的数组连接到主数组
  • 从主阵列中删除本地存储阵列中已有的值
  • 将更新的主阵列追加到本地存储阵列

编辑:我想出了如何一一执行HTTP请求。不幸的是,请求不会按顺序运行。有什么想法吗?

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

我是如何设置的:

  • 加载首页,获取响应
  • 从响应中获取所需的 id 数组
  • id 数组与存储阵列连接
  • 删除重复项(这是保存所有 ID 并且我再次检查第一页(使用最新 id(后的时间(
  • 将其保存到本地存储
  • 如果存储阵列中不存在阵列中的任何 id,则从函数中再次调用该函数,页码为 +1

最新更新