首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保持Ajax活力

保持Ajax活力
EN

Stack Overflow用户
提问于 2012-09-16 20:22:20
回答 2查看 3.3K关注 0票数 3

我正在尝试让我的ajax从服务器请求信息,并且在中断和重新启动之前保持至少1分钟的活动状态,并获取和传递一个新的streamitem_id (如果他们的call是从上次调用以来插入的)。

目前它运行得如此之快,而且只运行一次,我不明白为什么。

AJAX

代码语言:javascript
复制
<script type="text/javascript" charset="utf-8">

function wait() {
    var streamitem_id =<? echo $streamitem_catch['streamitem_id']; ?>;
    $.ajax({
        type: "POST",
        url: "testingajaxfeed.php?streamitem_id=" + streamitem_id,
        async: true,
        cache: false,, 
        dataType: "json",
        data: {streamitem_id: streamitem_id}, 
        success: function (response) {
        setTimeout("wait()",1000);
            $("#homestatusid").prepend("MY INSERTED RESPONSE");
        },
    });
}
$(document).ready(function(){
wait();
}); 
</script>

PHP

代码语言:javascript
复制
if (isset($_POST['streamitem_id'])) {
$lastID = (int)$_POST['streamitem_id'];

if(empty($lastID)) {
 die('timeout');
}
else {
$following_string = $_SESSION['id'];
$result="SELECT d.*, c.*, u.*
  FROM streamdata          AS d
  JOIN streamdata_comments AS c ON d.streamitem_id = c.comment_streamitem
  JOIN users               AS u ON u.id = c.comment_poster
 WHERE d.streamitem_id > '$lastID'
   AND c.comment_poster = '$following_string'
   AND (d.streamitem_creator  = '$following_string')
   OR d.streamitem_creator IN $friendlist
   AND d.streamitem_type_id NOT IN ('3')
   ORDER BY '$lastID' DESC LIMIT 1";
$result = mysqli_query($mysqli, $result) or die(mysqli_error($mysqli));

while ($resultArr = mysqli_fetch_array($result)) {
$json = array();
    $json['streamitem_id'] = $resultArr['streamitem_id'];
    $json['streamitem_content'] = $resultArr['streamitem_content'];
    $json['streamitem_timestamp'] = Agotime($resultArr['streamitem_timestamp']);
    $json['comment_id'] = $resultArr['comment_id'];
    $json['comment_content'] = $resultArr['comment_content'];
    $json['comment_poster'] = $resultArr['comment_poster'];
    $json['comment_datetime'] = Agotime($resultArr['comment_datetime']);
    $json['comment_streamitem'] = $resultArr['comment_streamitem'];
    $json['username'] = $resultArr['username'];
    $json['id'] = $resultArr['id'];
    $json['first'] = $resultArr['first'];
    $json['middle'] = $resultArr['middle'];
    $json['last'] = $resultArr['last'];
echo json_encode($json);
}}}
EN

回答 2

Stack Overflow用户

发布于 2012-09-16 20:29:15

setTimeout并不像您期望的那样工作。ajax请求不能像您希望的那样“保持活动状态”。请求被发送,PHP-script返回内容,ajax-script获取结果。所有这一切都发生在大约1-2秒内。

如果它用于某种类型的流(就像它看起来那样),您将不得不在一小段时间间隔内一次又一次地重复该函数。

我已经像这样修改了你的代码:

代码语言:javascript
复制
<script type="text/javascript" charset="utf-8">

function wait() {
    var streamitem_id =<? echo $streamitem_catch['streamitem_id']; ?>;
    $.ajax({
        type: "POST",
        url: "testingajaxfeed.php?streamitem_id=" + streamitem_id,
        async: true,
        cache: false,
        dataType: "json",
        data: {streamitem_id: streamitem_id}, 
        success: function (response) {
            $("#homestatusid").prepend("MY INSERTED RESPONSE");
        },
    });
}
$(document).ready(function(){
setInterval(wait,10000);
}); 
</script>

ajax脚本将每10秒触发一次。您可以自己编辑速度,但请记住,短时间内过多的请求可能会导致服务器崩溃/变慢。

票数 0
EN

Stack Overflow用户

发布于 2012-09-16 20:30:04

在您的PHP脚本中,您需要使用sleep函数来保持连接的活动状态。

类似于:

代码语言:javascript
复制
function callScript(callback) {
    $.post('myscript.php',{data:data},function(data) {
        if (data == -1) {
            return callScript(callback);
        }
        return callback(data);
    }
}

myscript.php

代码语言:javascript
复制
$interval = 50;
$iters = floor(1000 / $interval);
while($conditional === false) {
    if (--$iters < 1) { die(-1); } 
    sleep($interval);
}
echo $json;

虽然这并不完全是你需要的,但它可以很容易地适应你的需要。我已经用其他东西做到了这一点,虽然代价很高,但你可以使用SQL语句来等待添加条目等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12446818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档