2

getJSONを使用してサーバーからJSONを取得し、このデータを処理してユーザーに提示するプログラムがあります。しかし、サーバー上のデータは頻繁に更新されています。5分ごとに新しいJSONを取得してユーザーに表示し、バックグラウンドスレッドで実行するにはどうすればよいですか?これにsetTimeoutを使用できますか?

ありがとう!マット

4

2 に答える 2

6

5 分ごとに発生する間隔を使用することは、明白な (そして最もブラウザーと互換性のある) アプローチです。

これは別のスレッドを作成しませんが、そうすることの従来のシミュレーションです。実際に発生するのは、非同期イベントがキューに入れられ、実行するように規定した時点にできるだけ近い時点で実行されることだけです。ただし、同じスレッドで実行されるため、精度は保証されません。そのため、JS エンジンの実行に「機会の窓」が必要です。

つまり、JS エンジンは必要なときにコードを実行するために最善を尽くしますが、それは自由に実行できる場合に限られます。

古いブラウザーのサポートを気にしない場合は、別のスレッドで実行されるweb workerを使用できます。

Web ワーカー スクリプト

self.addEventListener('message', function(evt) {
        var gateway = new XMLHttpRequest();
        var intie = setInterval(function() {
        gateway.open("GET",evt.data.load_url,true);
        gateway.send();
        gateway.onreadystatechange = function() {
            if (gateway.readyState==4 && gateway.status==200)
                self.postMessage(gateway.responseText);
        }
   }, 300000); //every 5 minutes
}, false);

(注: Web ワーカー内で jQuery を使用する方法を認識していないため、jQuery ではなくバニラ JS を使用します。スクリプトをインポートできますが、jQuery は を参照windowします。ウィンドウまたは DOM)

メインの JS スクリプト

var worker = new Worker('worker.js');
worker.addEventListener('message', function(evt) {
    //the loaded JSON data is now held in evt.data
    alert(evt.data);
}, false);
worker.postMessage({load_url: 'json.txt'});

5 分ごとに新しいワーカーを呼び出すことにメリットがあるのか​​、それとも私が行ったように 1 つのワーカーを使用して 5 分ごとに動作させることにメリットがあるのか​​はわかりません。どちらの場合も間隔があるため、おそらくそれほど多くはありません。

于 2012-07-02T10:44:37.290 に答える
0

はい、データを取得できますsetTimeout(またはsetInterval、無限に実行したい場合)。私はそれがあなたのより良い選択肢だと思います...

于 2012-07-02T10:16:08.330 に答える