0

これは私がやろうとしていることです:

  • リモート サーバー スクリプトから JSON オブジェクトを要求する
  • JavaScript がすべての応答データを取得するまで待機します
  • 応答オブジェクトから値を出力します

get config 関数で setTimeout を使用して、値が未定義の場合は 1 秒後に自分自身をリコールしようとしています。

あるいは、数秒間ループするメソッドを作成することもできるようですが、私がやろうとしていることを達成するためのより良い方法があれば、それを避けたいですか? 私の現在のコードは、ランタイムを壊す遅延なしに再帰しているようです

アイデアをありがとう、コードは次のとおりです。

function runApplication() {
    var initialiser = new Initialiser();
    var config = new Config();
    initialiser.fetchConfigurations(config);
    config.alertValue('setting1');
}

function Initialiser() {
    debug.log("Started");
}

Initialiser.prototype.fetchConfigurations = function(config) {
    var req = new XMLHttpRequest();
    var url = CONFIGURATION_SERVER_URL;
    req.onreadystatechange = function() {
        if (req.readyState == 4 && req.status == 200) {
            var configObject = eval('(' + req.responseText + ')');
            config.setConfig(configObject);
        } else {
            debug.log("Downloading config data...please wait...");
        }
    }
    req.open("GET", url, true);
    req.send(null);
}
function Config() {
    this.config
}

Config.prototype.setConfig = function(configObject) {
    this.config = configObject;
}

Config.prototype.getValue = function(setting) {
    if(this.config === undefined) {
        setTimeout(this.getValue(setting), 1000);   
    } else {
        return this.config[setting];
    }
}


Config.prototype.alertValue = function(setting) {
    if(this.config === undefined) {
        setTimeout(this.alertValue(setting), 1000); 
    } else {
        alert(this.config[setting]);
    }

}
4

3 に答える 3

1

私が見ていることから.setConfig、次の部分を処理する に余分なステップを追加するだけです。

Config.prototype.setConfig = function (data) {
    this.config = data;
    this.doSomethingAfterTheDataExists();
};

これを行うには多くの方法があります...
...モデレーター/オブザーバー/pub-sub の実装を書くのはとても簡単で、与えられた利点のために比較的少ない行で行うことができます...

Promise システムを作成するとさらに強力になりますが、より多くの作業が必要になります (これは上記の実装に似ており、抽象化のレイヤーを追加して、非同期用の非常にクリーンで簡単なインターフェイスを作成するためです)。

メッセージを発行したり、別のメソッドを起動したりする代わりに、AJAX 呼び出しの.setConfig後で別のメソッドを呼び出すこともできます。.setConfig

xhr.onreadystatechange = function () {
    // .......
    config.setConfig(/* ... */);
    config.doSomethingAfterTheDataExists();
};

複数のプロパティに複数の割り当てを行う複数の AJAX 呼び出しを行っており、すべての呼び出しが完了するまで待ちたい場合は、Promise システムの実装を検討する必要があります。
それはあなたの正気を救い、忘却に縮小できる〜60〜100行の価値があります.

その 1 つの応答が戻ってくるのを待っているだけの場合は、 がonreadystatechange終了し、データがそこにある (成功チェック) と同期した後に何が起こるかを覚えておいてください。
待機は非同期部分です。
配信されると、すべて (小切手の内容を含む) が手続き型に戻ります。

于 2013-03-27T20:55:51.243 に答える
0

XMLHttpRequest の非同期呼び出しの代わりに同期呼び出しを使用できます。ただし、応答を待っている間にユーザーが Web ページと対話する必要がある場合、これは最適なオプションではない可能性があります。

...
req.open("GET", url, false);
request.send(null);
于 2013-03-27T20:53:13.200 に答える
0

jQuerygetJSON を success/doneコールバックで使用するだけです。

于 2013-03-27T20:43:27.857 に答える