2011-10-19 10 views
0

基本的な使用例。私は遠隔に引っ張られたデータを格納するグローバル変数を持っています。データがない場合、最初にロードし、ロードを待ってから処理を続行します。私は本当に私がする必要がない場合は、同期プロセスを使用したいと思いません。リモートデータのロード、キャッシング、およびJavaScriptでの継続

は_companiesがグローバル変数である。このような何か...私は何かを明らかに欠けているように私は感じ

if (_companies === undefined || _companies.length == 0) { 
     loadExternalData(); 
    } 
    // do something with the data in _companies 

を考えてみましょう。私はasync = falseと呼ぶことができると理解していますが、それはちりのようです。ブロック内のすべてのコードを関数内に配置し、if..elseを作成してからloadExternalData()関数を呼び出すこともできますが、else文で関数を呼び出すこともできますが、やはりクルージュのように見えます。私はコールバックでその全体をラップすることができるはずだが、私はそれを行う方法を知らないようだ。

+0

サイドノート:常に 'typeof演算変数を使用する===「undefined''。技術的には 'undefined'をオーバーライドすることができます...' var undefined = 'これは文字列です'; –

+0

あなたが求めているものはまだ分かりませんが、setTimeout()/ setInterval()はスケジューリングに役立ちます/アプリケーションランタイム中のチェック。私はあなたがなぜasync = falseをしたいのか理解できません。 – mattacular

答えて

1

コメントを含め、以下のコードをご覧ください。コードは、あなたの質問の関数と同じ構造を持っています。何かが不明な場合は、コメントを追加してください。

var companies; //Cache 
function loadExternalData(callback){ 
    var xhr = new XMLHttpRequest(); 
    xhr.onreadystatechange = function(){ //Set readystatechange event 
     if(xhr.readyState == 4 && xhr.status == 200){ //Request finished: 200 OK 
      callback(xhr.responseText); //Call callback func with data 
     } 
    } 
    xhr.open("get", "http://example.com", true); //True = async 
    xhr.send(null); 
} 

function parseData(data){ 
    if(data) {//If data is defined, set companies 
     _companies = data; 
    } 
    if (typeof _companies == "undefined" || _companies.length == 0) { 
     loadExternalData(parseData); //Pass callback function 
     return; //No data, return function 
    } 
    //When the function reaches this point, _companies exist. 
    //Normal function behavior 
} 

も参照してください:MDN: Using XMLHttpRequest

+0

私は同僚の助言に基づいて同様の点に実際に達しました。私はこのコードを、私が一緒に掘り下げたものと比べて見ていきます。 – Jay

+0

最初の非同期呼び出しが既に実行されている間に元の操作に2回目の呼び出しがあった場合はどうなりますか? '_companies'が依然としてまだ割り当てられていないので、不要な第2の呼び出しがトリガされます。 –

+0

@DanielEarwickerこの場合、3番目の変数/フラグを使用して関数の状態を追跡する必要があります。このフラグは、関数の呼び出し時にチェックされる必要があります。要求が失敗すると、再試行を可能にするために、フラグをトグルする必要があります。要求が成功すると、キャッシュをリフレッシュしない限り、フラグには触れないでください。 –

関連する問題