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 が未定義であるというエラーが表示されます。基本的に、これが機能しない理由がわかりません。returnステートメントと関係があると思います。呼び出されたときに .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

$.getJSON は非同期リクエストです。つまり、コードは実行されますが、完了するまで待機しません。コードは次の 2 つの理由で機能しません。

  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 に答える
0

コールバックからはできませんreturn。代わりに、data外側で宣言された変数を代入するか、コールバック内でtreeData必要なことを行う必要があります。data

于 2012-04-22T21:58:08.367 に答える
0

デフォルトでは、AJAX リクエストは非同期です。関数が戻るまでに、AJAX リクエストはまだ完了しておらず、データは利用できません。に渡すコールバック関数からデータの使用を開始する必要があります$.getJSON。そうすれば、コードはデータにアクセスできるようになります。ジョセフはこれの例を提供しました。

于 2012-04-22T22:00:20.227 に答える