我想知道是否可以使用$ .getJSON进行长轮询以及正确的前端和后端逻辑是什么。
到目前为止,我已经提出了这个问题但尚未对其进行测试,因为我非常确定错误和/或缺少逻辑。
这是JS:
function lpOnComplete(data) {
console.log(data);
if (!data.success) {
lpStart();
}
else {
alert("Works!");
}
};
function lpStart() {
$.getJSON("http://path.to.my.URL.php?jsoncall=?", function(data) {
// What happens when no data is returned
// This is more than likely since there
// is no fall back in the PHP.
lpOnComplete(data);
});
};
PHP:
$time = time();
while((time() - $time) < 30) {
// only returns data when it's new.
$data = checkCode();
// What would be the proper way to break out
// and send back $data['success'] = false
// so the JS loop can continue?
if(!empty($data)) {
echo $_GET["jsoncall"] . "(" . json_encode($data) . ")";
break;
}
usleep(25000);
}
答案 0 :(得分:0)
从你所拥有的,Javascript将向服务器发出多个请求,每个请求都会启动无限循环,永远不会去任何地方。我建议像:js:
$.getJSON("http://my.site/startAsyncWork.php", null, function(data){
waitUntilServerDone(data.token, function(response){
alert("done");
});
});
function waitUntilServerDone(token, doneCallback){
$.getJSON("http://my.site/checkIfWorkIsDone.php", {"token": token}, function(response){
if(response.isDone){
doneCallback(response);
}
else{
setTimeout(function(){
waitUntilServerDone(token, doneCallback);
}, 1000);
}
});
}
我不知道php,所以我不会为该方编写示例代码,但基本上,startAsycWork.php组成了一个与请求关联的随机令牌。然后它产生一个线程,完成所需的所有工作,并将令牌返回给响应。
当工作线程完成时,它会将工作结果写入诸如token.dat之类的文件中(或将其放入缓存或其他任何内容中)。
checkIfWorkIsDone.php检查token.dat是否存在,如果不存在则返回false,如果不存在则返回内容。