【发布时间】:2016-06-14 22:50:28
【问题描述】:
我不确定这是否是使用 ajax 的有效方式,但我正在使用 for 循环遍历一组信息:
loadProfiles.js
var tempString = "";
var searchPeople = function(sv){
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function(){
if(xhttp.readyState == 4 && xhttp.status == 200){
tempString = xhttp.responseText;
loadPeople(tempString, sv);
}
}
var searchvalue = sv;
searchvalue = searchvalue.join(" ");
xhttp.open("GET", "php/searchProfiles.php?searchvalue=" + searchvalue, true);
xhttp.send();
}
var loadPeople = function(people, sv){
loadedPeople = [];
var normList = people.split(",");
var list = people.toLowerCase().split(",");
list.splice(list.length - 1, 1);
var zsearch = sv;
for(var i = 0; i < list.length; i++){
loadedImageId[i] = list[i].split("_")[1];
if(loadedImageId[i] == 0){
loadedImageId[i] = "images/GrayProfilePic.png";
}
else{///////////////////////////////////This is what I need to fix
var grabPic = new XMLHttpRequest();
grabPic.onreadystatechange = function(){
if(grabPic.readyState == 4 && grabPic.status == 200){
console.log("ready to go");
loadedImageId[i] = grabPic.responseText;
if(loadedImageId[i] == "Error1"){
loadedImageId[i] = "images/GrayProfilePic.png";
}
}
}
grabPic.open("GET", "php/grabProfPics.php?imageid=" + loadedImageId[i], true);
grabPic.send();
}//////////////////////////////////////////////
list[i] = list[i].split("_")[0];
for(var j = 0; j < zsearch.length; j++){
if(list[i].indexOf(zsearch[j]) > -1){
if(loadedPeople.indexOf(list[i]) == -1){
if(loadedPeople.indexOf(normList[i].split("_")[0]) == -1){
loadedPeople.push(normList[i].split("_")[0]);
}
}
}
}
}
console.log(loadedPeople);
console.log(loadedImageId);
}
searchProfiles.php
$query = "SELECT username, imageid FROM `memberHandler`";
$result = mysqli_query($connect, $query) or die("Could not query");
while($row = mysqli_fetch_assoc($result)){
echo $row['username'] . "_" . $row['imageid'] . ",";
}
grabProfPics.php
$query = "SELECT image, mime_type FROM memberProfilePictures WHERE `id`='$imageid'";
$result = mysqli_query($connect, $query);
if(mysqli_num_rows($result) != 0){
$row = mysqli_fetch_assoc($result);
$imagesrc = $row['image'];
$imagesrc = base64_encode($imagesrc);
$imagetype = $row['mime_type'];
echo "data:" . $imagetype . ";base64," . $imagesrc . "";
}
else{
echo "Error1";
}
但是服务器需要一些时间来发送它的返回码,此时 for 循环中的变量 i 早已被更改。有没有办法有效地做到这一点,并根据当前数组值用新信息更新数组?我希望这个问题是有道理的!感谢您的帮助 =)
基本上我正在尝试遍历图像 id,如果 id 不为零(意味着他们已经为他们的个人资料设置了图像-否则他们没有并且 id 为 0)然后它将使用 ajax 来连接到图像数据库,获取与特定 ID 相关的图像,然后返回图像源并更新数组。很抱歉,在我想我可以使用更简化的版本之前,我没有更具体地说明这一点。
【问题讨论】:
-
这不是一种有效的方法,您应该采用另一种方法。
-
您处理此问题的方法存在根本缺陷。您正在尝试同步执行异步操作,但我认为如果您开始使用 Promises 来管理问题的异步性质,这很容易解决。
-
您能否更具体地说明您要做什么以及遇到了什么问题?
-
我已经更新了帖子
-
没有进入关于你应该做什么的持续讨论,我想说你真的应该一次性将所有图像 ID 发送到你的后端脚本,一次 go 更新(对它们做任何事情),然后发回响应。遍历循环并为每个循环创建一个新的
$.ajax()请求是多余的。对数组运行for()循环,收集适当的ID,将它们发送到后端进行(批处理)处理。然后您可以返回更新的信息,这些信息可以添加到您的数组中。这样您就可以使用单个$.ajax()实例。
标签: javascript arrays ajax for-loop