2

我正在编写一个函数,它将连接到服务器并检索 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 过滤的值,因此该函数可以作为任何大型应用程序的标准函数。怎么做?

4

3 回答 3

1

就像评论中提到的那样,您的 ajax 请求将需要一些时间(时间很短,但仍然是时间),因此您console.log位于 ajax 调用之外的位置将在 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数组作为参数一。

fetch(some_key, function(names){
  console.log(names); //should work!
});
于 2013-05-01T05:40:14.313 回答
1

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

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

如果你想要更多的字典方法(看起来像你这样做)试试这个。

带有名称的 JavaScript 字典

此外,在阅读了其他评论并进行了更多思考之后……您可能希望将循环结果的代码移动到“成功”回调中。

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

祝你好运!

于 2013-05-01T05:40:40.170 回答
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
}

但是,您确实应该尽量远离同步请求。

于 2013-05-01T06:17:32.973 回答