关于我想要做的事情的一点背景:
我正在尝试创建一个实时聊天应用程序,它使用ajax重复检查服务器上的新消息
这里的不同之处在于我使用long-polling
技术,其工作原理如下:
<小时/>
我对如何编写客户端scipt很困惑。 根据上面的描述,脚本应该
receiving content
上,执行功能(更新聊天框),然后再次发送请求 timeout
上,只需再次发送请求,只需等待响应直到超时<小时/>
所以这是我在主页中的脚本:
<script type="text/javascript">
$(document).ready(function() {
getMsg();
});
function getMsg() {
var time = Math.floor(Date.now() / 1000);
$.ajax({
url: "get_message.php?lastupdate=" + time,
type: "GET",
dataType: "json",
timeout: 15000, //15 second timeout
success: function(response) {
$('#chatBox').append("> " + response + "<br/>");
getMsg();
},
error: function(x, t, m) {
getMsg();
}
});
}
</script>
<小时/>
如您所见,在error
和success
我正在调用getMsg()
函数中的getMsg()
函数。我不冒运行堆栈溢出的风险吗?我的意思当然这几乎是不可能的,因为这需要大量的递归,但仍然感觉像一个糟糕的编程方法...
是否有另一种方法可以在脚本中执行此操作:
感谢您花时间阅读本文!
答案 0 :(得分:3)
我不会冒着堆栈溢出的风险吗?
没有
当您致电$.ajax
时,getMsg
的当前实例等待以完成AJAX请求。它只是绑定了你拥有的所有事件处理程序,然后说“好吧,我已经完成了”:
function getMsg() {
var time = Math.floor(Date.now() / 1000);
$.ajax({
// all your options
});
// alright, I'm done
}
所以它返回。
为什么?,你问。因为AJAX中的“A”代表asynchronous。这意味着当您启动AJAX请求时,其他所有内容都可以继续。
当您在处理程序中调用getMsg
时,它是 递归的新实例。运行中永远不会有多个getMsg
。没有递归。没有堆栈溢出。没问题。
答案 1 :(得分:1)
jQuery还支持承诺上的always property。因此,为了更简洁,您可以在always块中执行getMsg()调用
.always(getMsg);
您不必担心递归,因为它只会在完成后触发。
答案 2 :(得分:1)
此类代码中没有危险
只需将getMsg()置于'完成'属性(以便有一个整点来调用函数),就像那样
<script type="text/javascript">
$(document).ready(function() {
getMsg();
});
function getMsg() {
var time = Math.floor(Date.now() / 1000);
$.ajax({
url: "get_message.php?lastupdate=" + time,
type: "GET",
dataType: "json",
timeout: 15000, //15 second timeout
success: function(response) {
$('#chatBox').append("> " + response + "<br/>");
},
complete: getMsg // code will be executed on success/error
});
}
</script>
你必须记住 - 如果反应很快 - 你会得到很多请求 - 所以也许限制时间为15秒分钟
<script type="text/javascript">
$(document).ready(function() {
getMsg();
});
function getMsg() {
var time = Math.floor(Date.now() / 1000);
$.ajax({
url: "get_message.php?lastupdate=" + time,
type: "GET",
dataType: "json",
timeout: 15000, //15 second timeout
success: function(response) {
$('#chatBox').append("> " + response + "<br/>");
},
complete: function(){
setTimeout(getMsg, 15000); // call with delay
}
});
}
</script>
答案 3 :(得分:0)
function getMsg() {
var time = Math.floor(Date.now() / 1000);
var settings = {
url: "get_message.php?lastupdate=" + time,
type: "GET",
dataType: "json",
timeout: 15000, //15 second timeout
};
var req = $.ajax(settings);
req.done(function(msg){$('#chatBox').append("> " + response + "<br/>");});
req.fail(function(msg){$('#chatBox').append("> Network offline<br/>");});
req.complete(getMsg); //runs after error/and success
}