提问人:dvtpetrosyan 提问时间:7/6/2023 更新时间:7/6/2023 访问量:27
发送请求直到获得响应 [重复]
Send Request Until Get Response [duplicate]
问:
我怎样才能在网页没有得到响应的情况下继续获取网页?
for (node of NodeList) {
const url = node.getAttribute('href')
const res = await fetch(url) //Code below won't execute if no response
const html = await response.text()
const scraper = new DOMParser()
const doc = scraper.parseFromString(text, 'text/html')
alert('successfully parsed')
}
因此,由于它以循环方式工作并一次发送非常多的请求,即使是网络的小而短的问题也会破坏整个过程,我该怎么办?
答:
0赞
mplungjan
7/6/2023
#1
我从不循环 AJAX,它可能会使服务器不堪重负,并且浏览器(如果在浏览器中)将没有时间更新界面。
我会尝试这样的事情
异步性可以通过仅在成功或错误时再次调用函数来解决
const urls = [...NodeList].map(node => node.getAttribute('href'));
const docs = [];
const max = urls.length;
let cnt = 0;
const getHtml = () => {
if (cnt >= max) {
processAllDocs(); // here we have them all
return;
}
try {
const res = fetch(url) //Code below won't execute if no response
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
return response.text()
})
.then(html => {
const scraper = new DOMParser()
const doc = scraper.parseFromString(text, 'text/html')
docs.push(doc)
cnt++
getHtml(); // get next - use setTimeout if you want to throttle
} catch (err) {
console.log(err.message);
if (err.message.includes("something really bad, please stop")) return; // stop all processing (server down or ten 500 errors in a row)
getHtml(); // get same - use setTimeout if you want to throttle
}
}
getHtml();
评论
0赞
dvtpetrosyan
7/6/2023
stackoverflow.com/questions/76615419/......
0赞
mplungjan
7/6/2023
这比你在这里问的要复杂得多。因此,如果这个问题是另一个问题的子部分,请删除这个问题
0赞
dvtpetrosyan
7/6/2023
是的,但是当我使用循环时,它只是关于循环。有了解决方案,你给了它,它得到了更多的代码部分。并不是说这个问题对其他人没有帮助
0赞
mplungjan
7/6/2023
但这是我一个月前回答的一个问题的精确副本
评论