XMLHttpRequestを使用してデータのリクエストをサーバーに送信するワーカースレッドがあります。その要求は、基本的にクライアントが持っている情報の現在の整合性をチェックするphpファイルを指し、クライアントが新しい情報を必要とする場合、それが送信されます。それ以外の場合、サーバーはクライアントが応答を必要とするまで情報をチェックします。サーバーが応答した後、プロセス全体が繰り返されます。
この問題は、スクリプトが応答していないことをブラウザが認識し、ユーザーにスクリプトを停止するオプションを提供した場合に発生します。ご覧のとおり、これは意図した結果ではありません。では、ブラウザを混乱させることなく、彗星のような構造を使い続けるための最良の方法は何でしょうか?
編集:スクリプトがハングしている理由を理解しました。スレッド内のどこかで繰り返すのではなく、ワーカースレッド全体を繰り返しました。ですから、私の質問は、プロセスが終了した後、どこからプロセスを再開するかということです。
<?php
//Client sends their current id
if(isset($_GET['id']))
$id = $_GET["id"];
//if id doesnt match servers id send them a new one
//other wise do not respond
$server_id = file_get_contents("ids.txt");
while($server_id == $id){
$server_id = file_get_contents("ids.txt");
sleep(1);
}
echo $server_id;
?>
Javascript:
self.addEventListener('message', function(e) {
var data = e.data;
switch (data.cmd) {
case 'start':
getInfo(data.id);
self.postMessage('ID :: ' + response);
break;
default:
self.postMessage('Unknown command');
};
}, false);
var response = null;
var request = new XMLHttpRequest();
function getInfo(inputID){
var url = "serverResponse.php?id=" + inputID;
request.open("GET", url, false);
request.onreadystatechange = updateState;
request.send(null);
}
function updateState(){
if(request.readyState == 4){
if(request.status == 200){
response = request.responseText;//getInfo(data.id);
}
}
}
html:
<html>
<script type="text/javascript">
function sayHI() {
var id = "666";
worker.postMessage({'cmd': 'start', 'id' : id});
}
var worker = new Worker('AjaxWorker.js');
worker.addEventListener('message', function(e){
document.getElementById('result').textContent = e.data;
//Some data has been received so go ahead and make another call to the server
//This is where the script hangs because the worker waits for a response
sayHI();
}, false);
</script>
<body>
<button type="button" name="submit" id="submit" onclick="sayHI()">Submit</button> </br></br>
<output id="result" name="result">Result</output>
</body>
</html>