长轮询和短轮询通常用于服务器端推送数据到客户端,特别是在需要实时或者近实时获取数据的场景。
短轮询:
客户端定时向服务器发送请求,服务器接收到请求后立即返回响应,无论是否有新数据。
长轮询:
客户端向服务器发送请求,服务器如果没有新数据可返回则会等待,直到有新数据可以返回,然后返回响应并关闭连接。客户端接收到响应后立即再次发起新的长轮询请求。
以下是使用JavaScript进行短轮询和长轮询的简单示例:
function pollData() {
fetch('/api/data')
.then(response => response.json())
.then(data => {
console.log(data);
// 在获取到数据后,再次发起轮询
setTimeout(pollData, 1000); // 每隔1秒发起一次请求
})
.catch(error => console.error(error));
}
// 初始化轮询
pollData();
长轮询(Long Polling):
function longPollData() {
const timeout = 10000; // 服务器端预计数据到达的最长时间
fetch('/api/data?timeout=' + timeout)
.then(response => response.json())
.then(data => {
console.log(data);
// 无论是否有数据,都立即发起新的长轮询
longPollData();
})
.catch(error => {
if (error.message === 'Timeout') {
// 如果发生超时,则在适当的延迟后重新发起长轮询
setTimeout(longPollData, 1000);
} else {
console.error(error);
}
});
}
// 初始化长轮询
longPollData();
在实现长轮询时,服务器端需要支持长时间保持连接的能力,例如使用HTTP流或WebSockets。