2013-03-17 46 views
0

在下面的代码中,我将这个值分配给来自JSON的变量,这个var tag = data[j]['text'];和我输出它与这console.log(tag);(用于测试)哪个起作用。值不会推到数组

我尝试将值推入与tags.push(tag);数组,但它不会工作!

为什么这些值不会进入数组?我只是想将tag的内容放入数组中...

function GetAvailableTags() { 
      var url = '/TextCodes/TextCodes?key='; 
      var tagGroups = []; 
      $('.ui-autocomplete-input').each(function() { 
       var key = $(this).attr('id'); 
       var tags = []; 
       //console.log(key); 
       $.getJSON(url + key, function (data) { 
        for (var j = 0, len = data.length; j < len; j++) { 
         var tag = data[j]['text']; 
         console.log(tag); 
         tags.push(tag); 
        } 
       }); 
       console.log(tags.length); 
       for (var k = 0, len = tags.length; k < len; k++) { 
        console.log(tags[k]); 
       } 
      }); 
     } 

感谢您的帮助。

+2

您必须推迟使用JSON调用的响应,直到调用实际完成; JavaScript程序不会等待响应。使用Deferreds或成功处理程序,并将代码放在那里。见http://learn.jquery.com/ajax/ – Matt 2013-03-17 16:35:08

+0

啊不是范围抱歉,错过了一个括号... – Maresh 2013-03-17 16:36:10

+1

您在ajax响应填满之前记录数组。请参阅[如何从函数返回AJAX调用的响应?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call-from-a功能) – Bergi 2013-03-17 16:36:14

回答

0

我的解决方案是有点漫长而愚蠢的,但它的工作原理。现在,我可以像数组textCodes['taxes']那样访问变量。 sdespont的async说明也有帮助。

var textCodes = GenerateTextCodes(); 
    console.log(textCodes); 

    function GenerateTextCodes() { 
     var arr = []; 
     $('.ui-autocomplete-input').each(function() { 
      var id = $(this).attr('id'); 
      arr[id] = GetAvailableTags(id); 
     }); 
     //console.log(arr['taxes']); 
     return arr; 
    } 

    // get all autocomplete element IDs and put them into an array 
    function GetAvailableTags(key) { 
     var url = '/TextCodes/TextCodes?key='; 
     var tags = []; 
     $.ajax({ 
      url: url + key, 
      type: 'GET', 
      async: false, 
      success: function (data) { 
       //console.log(data[0].text); 
       //console.log(data.length); 
       for (var i = 0; i < data.length; i++) { 
        //console.log(data[i].text); 
        tags.push(data[i].text); 
       } 
      }, 
      error: function (jqXHR, textStatus, errorThrown) { 
       alert('an error occurred!'); 
      } 
     }); 
     //console.log(tags); 
     return tags; 
    } 
2

因为$.getJSON是一个异步函数。这意味着你的代码

console.log(tags.length); 
for (var k = 0, len = tags.length; k < len; k++) { 
    console.log(tags[k]); 
} 

$.getJSON回调函数之前执行:

function() { 
    var key = $(this).attr('id'); 
    var tags = []; 
    //console.log(key); 
    $.getJSON(url + key, function (data) { 
     for (var j = 0, len = data.length; j < len; j++) { 
      var tag = data[j]['text']; 
      console.log(tag); 
      tags.push(tag); 
     } 
    } 

这就是为什么你的变量似乎是空的,当看到在你的代码之上,但它是如何可能在回调函数中使用console.log(tag);打印数据。

更新

下面是使用而不是$ .getJSON $就方法来指定使用参数asynch : false

通过这种方式,数据必须同步检索,服务器调用的例子响应(成功回调)是强制性的以继续进程。这种非标准方式的缺点是您的网页可能会冻结,等待服务器响应。这并不是最好的方法,但有时它是有用的。

function GetAvailableTags() { 
    var url = '/TextCodes/TextCodes?key='; 
    var tagGroups = []; 
    $('.ui-autocomplete-input').each(function() { 
     var key = $(this).attr('id'); 
     var tags = []; 
     //console.log(key); 
     $.ajax({ 
      url: url + key, 
      type: 'POST', 
      asynch: false,//specify to stop JS execution waiting the server response 
      success: function (data) { 
       for (var j = 0, len = data.length; j < len; j++) { 
        var tag = data[j]['text']; 
        console.log(tag); 
        tags.push(tag); 
       } 
      }, 
      error : function(jqXHR, textStatus, errorThrown) { 
       alert('an error occurred!'); 
      } 
     }); 
     console.log(tags.length); 
     for (var k = 0, len = tags.length; k < len; k++) { 
      console.log(tags[k]); 
     } 
    }); 
} 
+0

那么,我可以如何将json数据导入数组? – user1477388 2013-03-17 16:46:21

+0

您正在将值推入数组中。你只是试图在它到达之前显示它。您可以考虑使用$ .ajax并设置async = false而不是getJSON速记:请参阅http://api.jquery.com/jQuery.getJSON/ – 2013-03-17 16:48:57

+0

您的数据在数组中,但只有在执行回调时。将您的逻辑添加到回调中以使用像表单元素值更新之类的数组数据或任何您想要执行的操作。您也可以调用一个函数在回调结束时执行。 – sdespont 2013-03-17 16:49:40