使用jQuery each()函数返回一个值

6

我是JavaScript的新手,我想从JSON中检索值并将其推入数组中,以便我可以在另一个函数中再次解析此数组,但我不知道如何在向其中添加元素后返回数组。

在下面的脚本中,我无法显示items中的值

function gC(b,c,p) {

    $.getJSON('getmonths', 'b='+b+'&c='+c+'&p='+p, processJSON);    
}

function processJSON(data) {
      var retval = [];
      $.each(data, function(key, val) {

          retval.push(val); 
          //alert(retval.pop());
      });
      return retval;
}

    $(document).ready(function(){
       var b = $("#b").val();
       var c = $("#c").val();
       var p = $("#p").val();

       var items = [];

       items = gC(b,c,p);
       var i = 0;

       $('td').each(function(index) {
          $(this).attr('bgcolor', items[i]);
          i++;
       }

我该如何访问这个数组?

谢谢!

2个回答

4

在AJAX调用中,你不会直接返回结果,而是通过回调函数来获取结果。

function gC(b,c,p) {
    var retval = [];
    $.getJSON('getmonths', 'b='+b+'&c='+c+'&p='+p, processData);
}

function processData(data){
  var retval = [];
  $.each(data, function(key, val) {
      retval.push(val); 
      //alert(retval.pop());
  });
  alert(retval);
}

processData函数将在AJAX调用结束时被调用。它无法向另一个函数返回值,因此所有逻辑都必须放在这个回调函数内部。

更新:您还可以传递一个回调函数给gC,在完成后将调用该函数。

function gC(b,c,p,f) {
    var retval = [];
    $.getJSON('getmonths', 'b='+b+'&c='+c+'&p='+p, function(d){
       if(typeof f == 'function'){
         f(d);
       }
    });
}

然后您可以这样调用gC

gC(b,c,p,function(data){
    var retval = [];
    $.each(data, function(key, val) {
        retval.push(val); 
        //alert(retval.pop());
    });
    alert(retval);
});

更新2:我看到您添加到问题中的代码。这需要在回调函数中完成。

gC(b,c,p,function(data){
    var items = [];
    $.each(data, function(key, val) {
       items.push(val);
    });
    $('td').each(function(index){  // You don't need a separate i variable
                                   // you can just use the index from the loop
      $(this).attr('bgcolor', items[index]);
   }
})

1
当然,你可以向gC添加一个额外的参数,以便在需要在不同的地方使用数组时传递回调函数。 - alnorth29
谢谢您的回复,但问题仍然存在,那么我该如何从processData返回值?因为一旦我解析了JSON对象,我会通过解析它们来切换页面的计算元素类,并且我必须重新解析processData()的结果以在每个切换的元素上设置值。 - Jerec TheSith
1
@Jerec:你需要修改你的逻辑。你不能返回任何东西。你必须在回调函数内切换类。 - gen_Eric
问题在于,由于这是一个异步调用,alert(items);将在$.getJSON有机会填充它之前执行,因此此时items将为空。正如Rocket所建议的那样,您需要在回调中完成工作,以便确保通过ajax调用检索到数据。 - Mike C

3

只需要将代码放在回调函数中:

function processJSON(data) {
    var retval = [];
    $.each(data, function(key, val) {
        retval.push(val); 
    });
    $('td').each(function(index) {
        if (index < retval.length)
            $(this).attr('bgcolor', retval[index]);
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接