1

我对ajax和jquery都是新手,所以请原谅初学者的问题。我对使用 AJAX 调用和返回 JSON 对象的过程感到困惑,并且这些数据可用于程序的其余部分。

如果我有这样的功能:

function treeData(){
  $.getJSON("/recipe/recipelist/", function(data) {

    // sorts array by title, alphabetically 
    data.sort(function(a, b){
        return b.title < a.title ? 1 : b.title > a.title ? -1 : 0;
    }); 

    return data; 
  });
}

我尝试像这样访问这些数据,

var obj = treeData(); 

我收到一条错误消息,说 obj 未定义。基本上,我不明白为什么这不起作用。我假设这与我的退货声明有关。我希望能够构建另一个“删除”函数,该函数在调用时会触发 .getJSON 请求并重绘我的数据库条目列表。

提前致谢。

4

6 回答 6

2

您必须向它发送一个回调,以便您可以对返回的数据做一些事情treeData

//modified tree data
function treeData(callback){
    $.getJSON("/recipe/recipelist/", function(data) {
        data.sort(function(a, b){
            return b.title < a.title ? 1 : b.title > a.title ? -1 : 0;
        }); 
        callback(data); //supply the callback with the data
    });
}

var obj;

treeData(function(newdata){  //the supplied data
    obj = newdata            //assign to obj
});
于 2012-04-22T21:57:16.527 回答
2

AJAX 中的 A 代表异步,这意味着代码不会等待响应到达,而是会在响应到达时调用回调函数。如果您尝试立即返回该值,它还不会被设置。

在您的函数中也使用回调:

function treeData(callback){
  $.getJSON("/recipe/recipelist/", function(data) {

    // sorts array by title, alphabetically 
    data.sort(function(a, b){
        return b.title < a.title ? 1 : b.title > a.title ? -1 : 0;
    }); :


    callback(data); 
  });
}

用法:

treeData(function(obj){
  // here you can use the result
});
于 2012-04-22T21:57:30.260 回答
2

你不能那样做。该return语句从内部函数返回,而不是从treeData函数返回。

function treeData() {

  $.getJSON("/recipe/recipelist/", function(data) {

    // sorts array by title, alphabetically 
    data.sort(function(a, b){
        return b.title < a.title ? 1 : b.title > a.title ? -1 : 0;
    }); 

    // this is in the inner function
    return data; 
  });

  // this is in the treeData function
  return "whatever";
}

你可以用它Deferred来做到这一点。

function treeData() {
  return $.ajax({
      url: "/recipe/recipelist/",
      type: "get",
      dataType: "json"
  });
}

$.when( treeData() ).then(function(data) {
    data.sort(function(a, b) {
        return b.title < a.title ? 1 : b.title > a.title ? -1 : 0;
    });
    var obj = data;
    // you can use obj safely
});
于 2012-04-22T21:59:57.403 回答
0

你不能return从回调。相反,您应该分配data一个在外部声明的变量,或者只是在回调内部treeData做您需要做的事情。data

于 2012-04-22T21:58:08.367 回答
0

默认情况下,AJAX 请求是异步的,当您的函数返回时,AJAX 请求尚未完成并且数据不可用。您必须开始使用您传递给的回调函数中的数据$.getJSON。这样,您的代码将可以访问数据。约瑟夫提供了一个例子。

于 2012-04-22T22:00:20.227 回答
0

$.getJSON 是一个异步请求,这意味着代码被执行但不会等待它完成。该代码不起作用有两个原因:

  1. 您可能在 getJSON 完成执行之前分配了 treeData() 的值。

  2. 在您的示例中,treeData() 实际上并没有返回任何值,getJSON 回调会。

这会起作用:

var obj;

function treeData(){
  $.getJSON("/recipe/recipelist/", function(data) {

    // sorts array by title, alphabetically 
    data.sort(function(a, b){
        return b.title < a.title ? 1 : b.title > a.title ? -1 : 0;
    }); 

    obj = data; 
  });
};

treeData();

但是您不知道 getJSON 回调何时完成触发,因此您可能希望在回调本身中处理排序结果。

于 2012-04-22T22:03:48.510 回答