我正在寻找一个 javascript 客户端库来处理这样的 ajax 或 websocket 请求队列:
- 当用户在线且服务器启动时直接发送请求
- 当用户离线或服务器关闭时使用本地存储存储请求
- 当用户在线并且服务器重新在线时发送存储的请求
理想情况下:
- 没有jQuery
- 我也在寻找一个服务器端组件
我找不到这样的东西。例如,我应该使用 localstorage、window.navigator.onLine 和 socket.io 自己构建一个,还是已经有一些用于此目的的库?
谢谢。
我正在寻找一个 javascript 客户端库来处理这样的 ajax 或 websocket 请求队列:
理想情况下:
我找不到这样的东西。例如,我应该使用 localstorage、window.navigator.onLine 和 socket.io 自己构建一个,还是已经有一些用于此目的的库?
谢谢。
这个问题可能会被关闭,因为在 StackOverflow 上通常不欢迎请求库。然而,这是一个有趣的小挑战。(我花了大约 15 分钟才完成。)
这实际上不是一个很大的任务,只有 50 行左右。这可能就是为什么您找不到这样做的小型图书馆的原因。
function Sender() {
var requests = [],
state = 0; // 0 = closed, 1 = open
ws = new WebSocket();
ws.onopen = function() {
state = 1;
if (requests.length) {
send();
}
};
ws.onerror = function() {
if (ws.readyState !== 1) { // 1 is "OPEN"
close();
}
};
// Let's fill in the requests array if necessary
// IIFE because I don't want to pollute the scope with `req`
(function() {
var req = JSON.parse(localStorage.get('queue'));
if (req.length) {
requests = requests.concat(req);
}
}());
return {
send: function(msg) {
if (state === 0) {
requests.push(msg);
}
else {
send();
}
},
close: function() {
state = 0;
localStorage.set('queue', JSON.stringify(requests));
}
};
function send() {
var done = false;
while (!done) {
if (state === 1) {
ws.send(requests.pop());
if (!requests.length) {
done = true;
}
}
else {
done = true;
}
}
}
}
// Usage example
var sender = Sender();
sender.send('message');
// let's say your "disconnect" button is in a variable
disconnect.addEventListener('click', function() {
sender.close();
}, false);
除了正常的请求,服务器不需要处理任何事情。如果需要,您可以在发送的消息中添加时间戳,这样就很容易(2 行左右)跟踪时间。