Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查图像是否存在会产生403错误_Javascript_Jquery_Get - Fatal编程技术网

Javascript 检查图像是否存在会产生403错误

Javascript 检查图像是否存在会产生403错误,javascript,jquery,get,Javascript,Jquery,Get,我有一系列托管图像,但数量和url可以更改。但是,它们始终遵循相同的递增命名约定。为了存储存在的图像,我在可用图像中循环,直到遇到错误。此时,我存储结果并继续操作 function checkForExistingImage(u, r = [], i = 0){ var url = u + i; $.get(url).done(function() { r.push(url); checkForExistingImage(u, r, i +

我有一系列托管图像,但数量和url可以更改。但是,它们始终遵循相同的递增命名约定。为了存储存在的图像,我在可用图像中循环,直到遇到错误。此时,我存储结果并继续操作

function checkForExistingImage(u, r = [], i = 0){

    var url = u + i;

    $.get(url).done(function() { 
        r.push(url);
        checkForExistingImage(u, r, i + 1);
    }).fail(function(){
        //continue working with the 'r' array
    });
}
但是,这将始终导致控制台中出现403(找不到映像)错误,因为最后检查的映像将永远不存在


我怎么能不触发这个错误,或者在需要时抑制它呢?

我肯定会以更文明的方式重写它。除了由
console.log
(您可以删除)显式记录的错误之外,此函数不会记录任何错误

使用它应该更安全,因为它不会以每秒太多的请求轰击服务器,但是如果没有问题,您可以减少或删除超时

function Timeout(time) {
  return new Promise(function(resolve) {setTimeout(resolve, time);});
}

async function checkForExistingImages(baseUrl, maxImages, startImage = 0) {
  const results = [];
  // Some sanity check on params
  if(maxImages < startImage) {
    let tmp = maxImages;
    maxImages = startImage + 1;
    startImage = maxImages;
  }
  // from i to max
  for(let i=startImage; i<maxImages; ++i) {
    // Create image URL, change this as needed
    const imageURL = baseUrl + i + ".png";
    // `fetch` does not throw usually, but we wanted to avoid errors in console
    try {
      // Response will have 200/404/403 or something else
      const response = await fetch(imageURL);
      if(response.status == 200) {
        results.push(imageURL);
      }
      else {
        console.info("Image",imageURL,"was removed.");
        // stop loading
        break;
      }
    }
    // complete failure, some major error occured
    catch(e) {
      console.warn("Image",imageURL, "failed to send request!");
      break;
    }
    // If you're getting throttled by the server, use timeout
    await Timeout(200);
  }
  return results;
}
功能超时(时间){
返回新承诺(函数(解析){setTimeout(解析,时间);});
}
异步函数checkForExistingImages(baseUrl、maxImages、StartImages=0){
常量结果=[];
//对参数进行一些健全的检查
if(最大值<起始值){
设tmp=最大值;
最大年龄=起始年龄+1;
起始年龄=最大年龄;
}
//从i到max

对于(设i=startImage;i403表示禁止,未找到为404。您确定要访问的位置具有来自主机的权限吗?该错误看起来像是您查找存在哪些映像的方法的基本部分。您可以始终实现一些服务器端方法,返回实际数字,这样您就不必探测f或者从客户端获取它们。@Gavin是的,我可以很好地找到现有的图像,只是当我超过限制时,我产生了一个错误。@Pointy很遗憾,我没有访问后端系统的权限,而只有一个标记管理器使用Pointy,这个错误就是破坏递归的条件。如果你想保留现有的逻辑,但抑制它您可以尝试将对checkForExistingImage的调用包装在try-catch块中。我不能100%确定我是否理解答案。我的问题是我不知道最大值。它可能是3、4、9或10个图像。因此我迭代到最大值+1,当我得到错误时,我知道应该停止。但是,错误会记录下来,这是我不想要的。@Davy the
最大值
可以是
无穷大
,我在测试答案时刚把它包括进去。正如你所看到的,在
控制台下。info(“Image”,imageURL,“was remove”);
它将中断,不再加载。但是上面的代码不会产生任何错误。你可以删除
控制台。log
,这只是为了测试。