发送请求直到获得响应 [重复]

Send Request Until Get Response [duplicate]

提问人:dvtpetrosyan 提问时间:7/6/2023 更新时间:7/6/2023 访问量:27

问:

我怎样才能在网页没有得到响应的情况下继续获取网页?

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')
}

因此,由于它以循环方式工作并一次发送非常多的请求,即使是网络的小而短的问题也会破坏整个过程,我该怎么办?

javascript fetch httprequest httpresponse for-of-loop

评论


答:

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
但这是我一个月前回答的一个问题的精确副本