完成ajax,然后重新开始

Posted

技术标签:

【中文标题】完成ajax,然后重新开始【英文标题】:Complete ajax, then start again 【发布时间】:2012-12-04 11:31:50 【问题描述】:

我正在处理 php-ajax 聊天,我使用两种主要方法:“更新”和“发送”

更新函数(ajax):

$.ajax(
    type: 'POST',
    timeout: 9999999999999999,
    url: 'process.php',
    success: ...
);

进程.php:

function update()
   if(new messages)
   echo new messages...
   else
   sleep(5);update(); again...
   

发送函数(ajax):

$.ajax(
type: "POST",
url: "send.php",
success: function()
update();
)

我想在发送新消息时停止运行“更新”请求并立即重新启动它,以便发件人立即看到他的消息。我试过 ajax.abort() 但它仍然可以继续在服务器端执行调用。

如何完成 ajax 调用并返回成功,而不是中止它?

【问题讨论】:

您应该查看网络套接字。挂起请求已通过。 网络套接字支持有限,因此只有在您可以控制使用该应用程序的浏览器(内部)时才有用 @HugoDelsing ...或者如果您不介意为 IE 请注意,大多数代理会切断一个挂 this 长的请求。 @Jan 我可以将超时时间降低到 60 秒,然后在出现“超时”错误时重新启动它,这不是主要问题 【参考方案1】:

在您的 PHP 代码中,您可以检查连接是否已中止 http://php.net/manual/en/function.connection-aborted.php

但如果你真的想返回“成功”,我会在 send.php 中的会话中添加一些内容,例如

$_SESSION['SENDNOW']=true;

然后在 Process.php 中我会检查

if(new messages || $_SESSION['SENDNOW']==true)
   $_SESSION['SENDNOW']=false;

也许您应该将超时设置为 1 秒以加快响应时间。或者,如果你做得很好,你可以快速(比如每 500 毫秒)检查 $_SESSION['SENDNOW']==true 并且每 5 秒检查一次新消息

【讨论】:

5 sec 是一个例子,我使用 1 sec,但它仍然会有所不同,但 0.5 sec 会使 cpu 加载两次。我喜欢你使用 $_SESSION 的方法 您可以将更新函数更改为每 500 毫秒处理一次。然后在每次尝试时检查会话,并且仅在每次尝试时检查新消息 我们只能在 sleep() 之后检查 $_SESSION['SENDNOW'],我的目标是通过 sleep() 停止调用 在睡眠中你什么也做不了。这就是为什么我建议将睡眠时间保持在最低限度以加快更新速度【参考方案2】:

请试试这个:

第一个 document.ready() 函数将 Ajax 调用声明为如下变量:

var ajaxCall = null;

将此代码放入您的 AJAX 函数的顶部:

//AJAX request aborted
if ( typeof ajaxCall != 'undefined' ) 
     return false;

像这样调用 AJAX:

ajaxCall = $.ajax(
    type: 'POST',
    timeout: 9999999999999999,
    url: 'process.php',
    success: ...
);

所以每次都不要调用服务器。

【讨论】:

以上是关于完成ajax,然后重新开始的主要内容,如果未能解决你的问题,请参考以下文章

AJAX 中的“重新加载页面以获取...的源代码”

如何实现不刷新页面,只重新加载js文件?

如何实现不刷新页面,只重新加载js文件

仅在 javascript 循环完成后执行 ajax 调用

ajax iframe重新加载后图像不显示

WORD 文档怎么从第6页开始重新编写页码?