JSON AJAX - 返回空对象

时间:2014-05-12 09:27:01

标签: javascript jquery ajax json

我在函数中使用AJAX调用以这种方式从服务器检索一些数据:

getPolicies: function() {
  $.ajax({
    async: false, // wait for response
    type: "GET",
    url: "http://localhost:8080/getPolicies",
    contentType: "application/json",
    dataType: "json",
    success: function(jsonList) {
      for(var i in jsonList) {
        console.dir(jsonList[i].policyName);
      }
      return jsonList;
    },
    failure: function(err) {console.log("Error");}
  });
}

我正确地获取了JSON数组:

[ 
  { 
    "policyName": "policy1"
  },
  { 
    "policyName": "policy2"
  },
  { 
    "policyName": "policy3"
  }
]

该函数返回此JSON数组。 但是当我调用函数getPolicies()时,我只得到一个空的JSON对象{}。具体来说,如果我尝试

var policies = getPolicies();
console.log(policies[1].policyName);

我明白了:

Uncaught TypeError: Cannot read property 'policyName' of undefined

那么,即使我正确获取JSON数组,该函数又有可能返回一个空对象吗?! 感谢...

1 个答案:

答案 0 :(得分:5)

即使AJAX请求是同步*),return语句仍然只从成功处理程序返回。尝试这样的事情:

getPolicies: function() {
  // Declare variable here
  var resultList = null;

  $.ajax({
    async: false, // wait for response
    type: "GET",
    url: "http://localhost:8080/getPolicies",
    contentType: "application/json",
    dataType: "json",
    success: function(jsonList) {
      for(var i in jsonList) {
        console.dir(jsonList[i].policyName);
      }
      // Set the variable in the scope of getPolicies.
      resultList = jsonList;
    },
    failure: function(err) {console.log("Error");}
  });

  // This one actually returns getPolicies
  return resultList;
}

但总的来说,将AJAX调用同步化是不好的做法。相反,您可以从成功处理程序中更好地调用必要的功能。那也可以是另一个功能。例如,您可以声明

function processPolicies(policies)
{
  console.log(policies[1].policyName);
}

您的呼叫处理程序可能如下所示(:

$.ajax({
  async: true, // just let it run,
  type: "GET",
  url: "http://localhost:8080/getPolicies",
  contentType: "application/json",
  dataType: "json",
  success: function(jsonList) {
      processPolicies(jsonList);
  },
  ...

*)第一个A even代表Asynchronous。但另一方面,X代表XML,所以你在这里所做的事实上应该被称为JaJ而不是AJAX。 ;)