2013-03-25 81 views
2

我想使用ajax编写聊天应用程序。所以我需要每100毫秒(0.1秒)检查一次数据库中的用户消息表。是否有任何问题,如果我使用setTimeOut每100毫秒调用ajax?任何性能问题?任何陷阱或任何东西?使用setTimeOut进行Ajax调用

+0

没有任何问题,但只是确保你的ajax和后端能够发送回应内或小于90milisecond ... – 2013-03-25 06:40:08

+0

我怎么可以确保这一点? – 2013-03-25 06:42:45

+0

使用firebug firefox add就可以显示响应时间和内容......也可以使用yslow firefox addon查看哪个响应延迟... – 2013-03-25 06:43:55

回答

0

这是一个非常糟糕的主意。虽然它可能适用于本地计算机和少数用户,但无法轻松扩展到更多用户。我建议你看看websockets和长时间的投票。

+2

你建议长轮询,所以你可以建议任何例子..?按照我所知,长时间轮询可以使用setTimeout来实现......对。 – 2013-03-25 06:44:49

+1

@DipeshParmar长轮询和常规轮询之间的区别在于,您可以防止您的请求超时,并且服务器在需要时进行响应。您只在前一个过期或完成时发出新请求。您不一定会使用setTimeout,因为当您发送下一个请求时,取决于服务器响应的时间。 – 2013-03-25 06:46:11

+1

@DipeshParmar发送多个请求只是在短时间间隔内频繁发生多个请求,而不是长时间轮询。长轮询本质上意味着服务器不会写任何响应,并且在请求有任何数据写入之前(或者直到请求超时,这可能比几秒钟更长的时间)。只有当前请求过期或当前请求获得数据响应时,客户端才会发出新请求。 – Munim 2013-03-25 06:51:37

0

更好的选择是使用Socket.IO。它使这项任务轻松了许多

Socket.IO使得跨浏览器解决方案

socket.io

服务器例如:

var io = require('socket.io').listen(80); 

io.sockets.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
    console.log(data); 
    }); 
}); 

客户端(浏览器):

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost'); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 

编辑:

对于PHP,phpwebsocket类将是一个不错的选择以及客户端jquery plugin

+1

这是一个很好的建议,我自己是node.js开发人员,但问题是标记为asp.net和php。是否asp。网有什么类似websocket的解决方案? – Munim 2013-03-25 06:48:15

+0

@Munim IIS7不支持它,但IIS8会。我相信PHP中的网络套接字目前是可能的。 – 2013-03-25 06:50:11

+0

我是asp.net开发人员。我如何在asp.net中使用这个? – 2013-03-25 06:52:33

0

的JavaScript知道两类定时器:的setInterval和setTimeout的。 setInterval每隔100毫秒触发一次,setTimeOut在前一次触发100毫秒后调用下一个。在调整应用程序时,应该牢记这一行为。你也可以考虑网络工作者,他们真的在单独的线程上工作。他们沟通以消息为基础,这听起来是适合您问题的解决方案。确切的延迟(100毫秒或更长)是您真正需要尝试的。 John Resig的书显示,从21ms(IE9)到1ms(Opera),各种浏览器的实时定时器延时差异很大。