14

JQUERY/d3-noobとして、私はこれを機能させる方法を理解できないようです:

  supdog = d3.json(dataPath, function(jsondata){
    return jsondata;
  })
  console.log(supdog);

前もって感謝します。

4

3 に答える 3

21

問題の説明が非常に簡潔であるという事実に加えて、問題は何が何を返すかについてのあなたの仮定にあるようです。

関数 d3.json() は、直接返す非同期関数です (未定義の値を想定しています)。バックエンドからデータを受信したときにのみ、渡したコールバック関数が呼び出されます。明らかにここではコンテキストが異なり、コールバックの戻り値が自動的に d3.json の戻り値になることはありません (これは既に "long" を返しているため)。

あなたがやりたいことは、おそらく次のようなものです:

    var jsondata;
    d3.json(dataPath, function(dataFromServer) {
      jsondata = dataFromServer;
    }
    console.log(jsondata);

更新 1: 明らかに、上記の例はまだ完全には正しくありません。console.log() への呼び出しは、d3.json() が返された直後に行われます。したがって、サーバーはまだ完全に応答を送信していない可能性があります。したがって、コールバックが返されたときにのみデータにアクセスできます。固定例:

    var jsondata;

    function doSomethingWithData() {
      console.log(jsondata);
    }

    d3.json(dataPath, function(dataFromServer) {
      jsondata = dataFromServer;
      doSomethingWithData();
    })

(ややばかげていますが)実際の例については、http://jsfiddle.net/GhpBt/10/を参照してください。

更新 2: 上記の例は、コードが実行される順序を示していますが、最も美しいコードの価格に値するものではありません。私自身は、この「グローバル」変数を使用せず、上記の例を単純化して次のようにします。

    function doSomethingWithData(jsondata) {
      console.log(jsondata);
    }

    d3.json(dataPath, doSomethingWithData);

匿名の内部関数で個別に呼び出すのではなく、doSomethingWithData が d3.json に直接渡される方法に注意してください。

注:これは d3.js 固有の問題ではありません。基本的に、非同期のすべての JavaScript 関数は、同様の方法で動作する可能性があります。それらが何かを返す場合、それは渡されたコールバックの戻り値ではありません。

于 2012-09-29T21:40:55.340 に答える