0

私は、抽象グラフパッケージを初期化するコードを実行しています。グラフインスタンスを作成した後、サーバーからのget要求でデータを取得し、グラフデータプロバイダを更新します。問題は、(IE6 - 8のために)dataproviderを保持するオブジェクトがまだ初期化されていないため、データを更新しようとするとjavascriptがクラッシュすることです。JavaScript:保証オブジェクトの初期化

オブジェクトの準備が整うまで、コードを遅延させるにはどうすればよいですか? 疑似:

... 
... 
... 
// Init code 
$graph = new Graph(); 
... 
... 
... 
// GET request 
$.getJSON(..., ..., function(data) { 
    ... 
    ... 
    ... 
    // Make sure that $graph.series[0] is ready 
    // Should not use while, but something similar in functionality 
    while (!($graph.series && $graph.series[0])) 
    ; // Sleep the code until object is ready 

    // Set the dataprovider after init complete 
    $graph.series[0].setData(data); 
    ... 
    ... 
    ... 
}); 
... 
... 
... 

よろしく

答えて

0

のではなく、あなたのwhileループは(あなたが識別されるように、ではない非常にあなたが欲しいもの)、setTimeoutを使用しています。

$.getJSON(..., ..., function(data) { 
    processData(); 
    function processData() { 
     if (!($graph.series && $graph.series[0])) { 
      // Not ready yet, schedule to try again in a moment 
      // and quit 
      setTimeout(processData, 0); 
      return; 
     } 

     // It's there, process 
     $graph.series[0].setData(data); 
    } 
}); 

遅延がより0ミリ秒、当然の(一般的に下回らない5-10)になりますが、それは他のコードにあなたのために、そのオブジェクトを初期化する機会を与えてくれます。タイムアウトを追加して、何かが間違ってしまっても永遠にループしないようにすることもできます。

processDataはコールバックのコンテキストを超える閉鎖なので、それがそのコンテキスト内のスコープ内のすべての永続的な参照を持っているので、我々はまださえgetJSON戻ってからの私達のコールバック後dataにアクセスすることができますが、私たちができることを奇妙に思えるかもしれません(dataを含む)。 More:Closures are not complicated

0

私は数日前に同様のカップルをやったことがあります。このコードでは、オブジェクトgAutoが必要なプロパティで初期化されていることを確認しています。それが役に立てば幸い。

function check(callback) { 
    if (gAuto.hasOwnProperty('gm_accessors_')) { 
     callback(); 
    } else { 
     console.log('waiting for init'); 
     init(callback); 
    } 
} 

function init(callback) { 
    console.log('initializing'); 
    setTimeout(function() { 
     check(callback); 
    }, 1); 
} 

init(function() { 
    console.log('init done!'); 
      // access 'gm_accessors_' here 
}); 
関連する問題