【问题标题】:Cross Domain AJAX (getJSON) with long polling?具有长轮询的跨域 AJAX (getJSON)?
【发布时间】:2011-04-15 04:04:58
【问题描述】:

我想知道是否可以使用 $.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);
    }

【问题讨论】:

  • 顺便说一句,$.getJSON("...", function(data) { lpOnComplete(data); }) 可以缩短为 $.getJSON("...", lpOnComplete);

标签: php jquery xss getjson long-polling


【解决方案1】:

根据您所掌握的情况,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,如果存在则返回内容。

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 1970-01-01
    • 2011-04-20
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2011-09-19
    • 1970-01-01
    相关资源
    最近更新 更多