如何在JQuery $ .each函数中编辑全局变量?

博主在使用jQuery的$.each函数处理从服务器获取的JSON数据时遇到问题,发现全局变量imagesArray未在$.each内部更新。讨论中指出问题是由于$.each的异步性质,建议将处理代码移至回调函数内。同时,评论提供了避免使用全局变量的替代方案,建议在特定命名空间内共享变量。此外,还有关于如何在不确定数据何时加载完成时使用setTimeout的技巧作为解决方案。
摘要由CSDN通过智能技术生成

好的,这样的标题可能无法很好地解释我的问题。 希望这是有道理的。 这也是我第一个使用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);

希望对您有帮助.. :)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值