从嵌套的$ .getJSON返回值?

时间:2015-02-08 07:11:56

标签: javascript jquery ajax json

我有这样的事情:

var someJSON = function(){

  // Calculate some stuff here

  $.ajax({
    dataType: "json",
    url: "http://somewebsite.com/api/?callback=?",
    async: false,
    success: function(data) {
      return data; // How can I return this so that someJSON gets this value?
    }
  });

}();

console.log(someJSON); // I want someJSON to be = data from the ajax call

基本上,我希望someJSON最终成为通过ajax返回的这个json数据的值。如何从嵌套的$.ajax调用中返回值?我可以使用某种回调函数来传递值吗?

此外,我正在使用async: false,以便在someJSON设置值之前,脚本的其余部分不会尝试执行。这是正确的方法吗?

3 个答案:

答案 0 :(得分:3)

由于您正在使用async: false,因此您只需设置一个变量并从原始函数返回它:

var someJSON = function(){
    var returnVal;

    // Calculate some stuff here

    $.ajax({
        dataType: "json",
        url: "http://somewebsite.com/api/?callback=?",
        async: false,
        success: function(data) {
            returnVal = data;
        }
    });
    return returnVal;
}();

但是,您应该认真考虑是否真的需要使用同步AJAX,因为这会阻止浏览器。您应该学习使用异步调用的正确方法。参见

How do I return the response from an asynchronous call?
Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference

答案 1 :(得分:1)

您只能通过同步Ajax调用来执行此操作:

var someJSON = function(){
  // Calculate some stuff here
  var retVal = null
  $.ajax({
    dataType: "json",
    url: "http://somewebsite.com/api/?callback=?",
    async: false,
    success: function(data) {
      retVal = data;
    }
  });
  return retVal;
};

console.log(someJSON());

但是,请谨慎行事。一般来说,使用异步调用会更好,更安全,更快:

var someCalculatedObject = {};
function handleReturn(data)
{
   // process JSON.
}
$.ajax({
    dataType: "json",
    url: "http://somewebsite.com/api/?callback=?",
    async: true,
    data:someCalculatedObject
    success: handleReturn
  });

答案 2 :(得分:0)

您可以尝试这样

<强> DEMO

function someJSON() {
   var resp = $.ajax({
    dataType: "json",
    url: "http://somewebsite.com/api/?callback=?"
   })
   .success(function (data) {
   });
   return resp;
};


someJSON().success(function (data) {
   console.log(data);
});

希望这有帮助,谢谢。