好的,这样的标题可能无法很好地解释我的问题。 希望这是有道理的。 这也是我第一个使用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的异步性质。
#1楼
这里发生的是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();
});
}
#2楼
尝试这个:
function getRandomImages(limit) {
imagesArray = new Array();
$.getJSON('createImageArray.php', {limit: limit}, function(data) {
$.each(data, function(i, val) {
imagesArray[i] = val; //imagesArray is declared globally.
});
});
}
#3楼
首先:为什么要使用全局变量? 那是个坏主意,不要这样做。 您可以在给定名称空间内的函数之间共享变量,如下所示:
var NAMESPACE = {};
NAMESPACE.example = function() {
var myField = '1';
return {
someMethod: function() {
return myField;
},
anotherMethod: function() {
return myField;
}
};
}();
其次,获取数组后该怎么办? 您要在页面上显示图像还是其他? 您能否将img元素放在页面上,而不是将它们放入数组中?
#4楼
好吧,我第一次不明白这个问题。 这有点hackey,但是在不了解更多代码的情况下,我想在创建imagesArray时创建一个bool imagesLoaded。
function getRandomImages(limit) {
imagesArray = new Array();
imagesLoaded = false;
$.getJSON('createImageArray.php', {limit: limit}, function(data) {
$.each(data, function(i) {
imagesArray[i] = data[i]; //imagesArray is declared globally.
});
imagesLoaded = true;
});
}
然后,在调用getRandomImages()之后,使用setTimeout()将代码置于保留模式,直到imagesLoaded = true。 哦,也许在页面上放些加载图形供用户查看,以使他们不认为您的应用程序破产了。
#5楼
也许这项工作对我有用.. :)
$variable= new array();
$.getJSON("url", function(data){
asignVariable(data);
}
function asignVariable(data){
$variable = data;
}
console.log($variable);
希望对您有帮助.. :)