在其回调方法之外访问JSON对象

时间:2013-05-01 05:32:51

标签: javascript json

我正在编写一个函数,它将连接到服务器并检索JSON对象。它将处理它并返回一个普通数组,其值包含在某些HTML标记中。我知道可以使用其他方式完成,但我使用以下代码。

var names = new Array();
function fetch (key) {
  var url = 'server/server.php?key=' + key
  $.getJSON(url , sett = function(data) {
    $.each(data, function(key, value){
      names[key] = value['name'];
    });
    console.log(names);//works and print the values
  });
  console.log(names);//doesn't work, shows and empty array
}

我想返回一个数组,它将保存每个jQuery过滤的值,因此该函数可以作为任何大型应用程序的标准函数。怎么做?

3 个答案:

答案 0 :(得分:1)

如评论中所述,您的ajax请求将花费一些时间(时间很短,但仍然是时间),因此位于ajax调用之外的console.log将在ajax调用完成之前执行,显示原始的,空阵列。

您可以向fetch功能添加回调参数...

所以...

function fetch (key, callback) {
  var url = 'server/server.php?key=' + key
  $.getJSON(url , sett = function(data) {
    $.each(data, function(key, value){
      names[key] = value['name'];
    });
    // call callback inside the getJSON callback    
    callback && callback.call(this, names);
  });
}

现在,您的回调函数将names数组作为参数1。

fetch(some_key, function(names){
  console.log(names); //should work!
});

答案 1 :(得分:0)

我首先尝试将数组元素添加到数组中。

names.push(value['name']);

如果你想要更多的字典方法(你似乎这样做)试试这个。

JavaScript dictionary with names

此外,在阅读其他评论并考虑更多...之后,您可能希望将遍布结果的代码移动到“成功”回调中。

http://api.jquery.com/jQuery.getJSON/

祝你好运!

答案 2 :(得分:0)

我还没有测试过这个。但以下情况应该有效:

var names = new Array();
function fetch (key) {
  var url = 'server/server.php?key=' + key
  $.ajax({
    url: url,
    type: "get",
    success: function(data) {
      $.each(data, function(key, value) {
        names[key] = value['name'];
      });
      console.log(names); // this should still work
    },
    dataType: "json",
    async: false
  });
  console.log(names); // this should now work
}

但是,你真的应该试图远离同步请求。