我需要使用类似于&page=N
的标记遍历N个页面,从这些页面获取特定的I,最后还需要在本地存储中添加对象持有的最终数组中缺少的值。
由于可能有超过100页或更多的页面,所以我不能只执行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)
,我也怀疑这是导致数组不连接的原因。
尽管do / while循环之外声明了finalArr
变量,但它没有被更新(可能是因为concat发生在单独的函数中?)。
。
以下是我想要实现的全面解决办法:
中。
编辑:我知道了如何一个一个地处理http请求。不幸的是,请求没有按顺序运行。有什么办法吗?
发布于 2020-02-02 11:29:31
我发现了这一点,它帮助我处理顺序的http请求-递归- https://stackoverflow.com/a/55282152/4017077。
我是如何设置的:
从response
H 112
如果存储数组中没有in,则从函数内部再次调用函数,其值H 213F 214
https://stackoverflow.com/questions/60009423
复制相似问题