好的,这样的标题可能无法很好地解释我的问题。希望这是有道理的。这也是我第一个使用jQuery的应用程序,因此,如果我做一些愚蠢的事情,请原谅我。
我有以下功能:
function getRandomImages(limit) {
imagesArray = new Array();
$.getJSON('createImageArray.php', {limit: limit}, function(data) {
$.each(data, function(i) {
imagesArray[i] = data[i]; //imagesArray is declared globally.
});
});
}
getJSON正确获取了JSON对象。它返回如下内容:
{"image0":"images/19.10.FBB9.jpg","image1":"images/8.16.94070.jpg","image2":"images/8.14.47683.jpg","image3":"images/8.15.99404.jpg","image4":"images/8.13.20680.jpg","image5":"images/21.12.9A.jpg","image6":"images/8.17.75303.jpg"}
我正在调试,并且有信心data [i]正确包含从JSON对象获取的图像路径。但是,在调用getRandomImages()之后,我查看了我的全局imagesArray并注意到没有任何更改。我猜想它正在创建imagesArray的副本,而不是获取实际的副本。
有人可以告诉我该怎么做,以便使我的全局imagesArray在$ .each块中更新吗?我是否需要通过引用传递imagesArray?抱歉,我有点迷路。
谢谢您的帮助。
编辑:一些背景信息。我正在从数据库填充随机图像位置的数组。我不想一次将所有图像从db加载到数组,因为太多了。因此,我有一个计数器来跟踪我在图像阵列中的位置。完成图像处理后,将指针移至下一张图像。如果到达终点,则需要获取更多随机图像。这就是上面的js函数被调用的地方;它调用createImageArray.php从数据库中获取x个随机图像并返回一个数组。然后,我想将这些图像位置存储在我的全局imagesArray中。
我不确定如何重组我的代码以考虑.getJSON的异步性质。
最佳答案
这里发生的是getJSON
被异步调用。因此,该函数立即返回,并且稍后在某个时间点调用其中的代码。直到那时imagesArray才会被更新。
您可以让getJSON同步运行,但是我不建议这样做。相反,我建议对代码进行重组,以考虑AJAX请求的异步特性。
编辑:要发出同步请求,请使用async
选项(link)。使用常规的$.ajax
功能或设置AJAX全局选项。我不建议这样做的原因是,它锁定了浏览器。如果您的服务器无法及时响应,则用户将无法使用其浏览器。
重组代码并不难。只需在回调函数中移动用于处理图像数组的逻辑即可。例如,代替:
function getRandomImages(limit) {
imagesArray = new Array();
$.getJSON('createImageArray.php', {limit: limit}, function(data) {
$.each(data, function(i) {
imagesArray[i] = data[i]; //imagesArray is declared globally.
});
});
processImages();
}
做
function getRandomImages(limit) {
imagesArray = new Array();
$.getJSON('createImageArray.php', {limit: limit}, function(data) {
$.each(data, function(i) {
imagesArray[i] = data[i]; //imagesArray is declared globally.
});
processImages();
});
}