首页 > 解决方案 > JavaScript - 不能离开 while 循环,为什么?

问题描述

我正在建立一个小型项目网站以了解有关 WebDev 的更多信息。

我尝试从 imgur 获取随机图像。如果图像不存在或被删除,它可以很好地“过滤”removed.png 重定向。但我一直陷入无休止的循环。也许有人可以在这里帮助我找到错误!

示例代码段(如果您运行它,它将停止您的浏览器):

function fetch() {
	var src = document.getElementById("imageGrid").innerHTML = "";
	var max = 50;
	var i;
	for(i = 0; i < max+1; i++)
	{
		var tries = 0;
		var validPic = true;
		var img = document.createElement("img");
		img.id = i;
		img.height = 64;
		img.width = 64
		while(validPic)
		{
			tries ++;
			img.src = generate_string(5);
			if(testRedirect(img.src))
			{
				var validPic = false;
				var src = document.getElementById("imageGrid");
				src.appendChild(img);
			}
		}
	}
	$("img").addClass("loadedImage");
	$("img").attr("onmouseover","imageEnlarge(this)");
}

function testRedirect(url) {
	var actualUrl = "";
	var xhr = new XMLHttpRequest();
    xhr.open("GET", url, true);
	xhr.send();
	if (url != xhr.responseURL) {
		console.log("redirected to: " + xhr.responseURL);
		return false;
	}else{
		console.log("no redirecton found");
		return true;
	}
	return false;
}

function generate_string(length) { 
	var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghiklmnopqrstuvwxyz"; 
	var string = ""; 
    var i;
	for (i = 0; i < length; i++) {
		string += chars[Math.floor((Math.random() * chars.length) + 0)];
	}	 
	return "http://i.imgur.com/" + string + ".jpg";
}

function imageEnlarge(x) {
	
	document.getElementById('bigImage').src = x.src;
 }
 
<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8">
<script src="scripts/fetch.js"></script>
<script src="scripts/jquery.js"></script>
</head>

<body>


<button id='fetchButton' onclick="fetch()">Imgur</button> 
<div id="imageGrid"></div>
<img id="bigImage" width="400" height="400"/>
<script>
</script>




</body>

</html>

我考虑了[标记为重复] - 问题链接。并试图将其应用于我的案例。这就是我现在得到的。我想我现在并没有真正掌握异步的东西。有人可以帮我吗?

新代码:

function fetch() {
	var src = document.getElementById("imageGrid").innerHTML = "";
	var max = 50;
	var i;
	for(i = 0; i < max+1; i++)
	{
		var validPic = true;
		var img = document.createElement("img");
		img.id = i;
		img.height = 64;
		img.width = 64
		while(validPic)
		{
			var validImgur = false;
			img.src = generate_string(5);
			testRedirect(img.src, function(x){var validImgur = x; });
			if(validImgur)
			{
				var validPic = false;
				var src = document.getElementById("imageGrid");
				src.appendChild(img);
			}
		}
	}
	$("img").addClass("loadedImage");
	$("img").attr("onmouseover","imageEnlarge(this)");
}

function testRedirect(url, fn) {
	
	var xhr = new XMLHttpRequest();
	xhr.open('GET', url, true);

	xhr.onreadystatechange = function () {
		if (this.readyState == 4 && this.status == 200) {
			if(url != xhr.responseURL) {
				console.log("redirection to: " + xhr.responseURL);
				fn(false);
			}else {
				console.log("no redirection found");
				fn(true);
			}
		}
	};
	
	xhr.send();
	
}


function generate_string(length) { 
	var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghiklmnopqrstuvwxyz"; 
	var string = ""; 
    var i;
	for (i = 0; i < length; i++) {
		string += chars[Math.floor((Math.random() * chars.length) + 0)];
	}	 
	return "http://i.imgur.com/" + string + ".jpg";
}

function imageEnlarge(x) {
	
	document.getElementById('bigImage').src = x.src;
 }
 
<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8">
<script src="scripts/fetch.js"></script>
<script src="scripts/jquery.js"></script>
</head>

<body>


<button id='fetchButton' onclick="fetch()">Imgur</button> 
<div id="imageGrid"></div>
<img id="bigImage" width="400" height="400"/>
<script>
</script>




</body>

</html>

标签: javascripthtmlxmlhttprequestimgur

解决方案


推荐阅读