Javascript 检查图像是否存在会产生403错误
我有一系列托管图像,但数量和url可以更改。但是,它们始终遵循相同的递增命名约定。为了存储存在的图像,我在可用图像中循环,直到遇到错误。此时,我存储结果并继续操作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 +
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
,这只是为了测试。