比轮询更有效的方法是使用 websocket,例如Faye或Socket.IO。您可以在数据存储事件下放置一个发出事件,以立即发送已存储的数据。
使用 Socket.IO,您可以这样做:
var io = require('socket.io').listen(80);
//note that you can listen on HTTP servers
//can also be used with Express applications, etc
//when data is stored, run this
io.sockets.emit('event', {
object: 'that is sent to client'
});
然后您可以使用它来告诉客户端有新数据,或者您可以直接发送新存储的数据。可以定义自定义事件,例如
io.sockets.emit('data_receive', function (data) {...});
并且会像这样收到客户端:
var socket = io.connect('http://socket.location');
socket.on('data_recieve, function (data) {
//data is whatever sent from server
});
在 Faye 中,你会做这样的事情:
var http = require('http');
var faye = require('faye');
var bayeux = new faye.NodeAdapter({
mount: '/faye',
timeout: 45
});
bayeux.listen(8000);
然后在存储数据时,您将运行:
client.publish('/path', {
data: 'Hello world'
});
任何创建了这样的客户端的客户端:
var client = new Faye.Client('http://socket:port/path');
client.subscribe('/path', function(data) {
alert('Received data: ' + data.text);
});
会收到数据。