javascript - 是否有一个 javascript 客户端库,用于对具有存储支持的 ajax 请求进行排队

标签 javascript ajax websocket socket.io

我正在寻找一个 javascript 客户端库来处理这样的 ajax 或 websocket 请求队列:

  • 当用户在线且服务器已启动时直接发送请求
  • 在用户离线或服务器关闭时使用本地存储存储请求
  • 在用户在线且服务器重新在线时发送存储的请求

理想情况下:

  • 没有jquery
  • 我也在寻找一个服务器端组件

我找不到这样的东西。我是否应该使用 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 行左右)跟踪时间。

关于javascript - 是否有一个 javascript 客户端库,用于对具有存储支持的 ajax 请求进行排队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18701362/

相关文章:

javascript - 使用网络套接字在浏览器中创建图形

tcp - 如何确定 websocket 连接的 Ping 间隔

javascript - 如何将数组的 javascript 映射转换为 javascript 中的 json 对象?

javascript - HighCharts 错误的 xAxis 标签

jQuery 在等待 Ajax 完成时阻止任何其他进程的最佳方法

javascript - 将 js 对象作为 json 传递给 jquery?

javascript - 关于Rails/JQuery/Prototype/RJS的情况

javascript - 防止 WebSocket 中第一条接收到的消息理论上丢失

javascript - 将索引动态附加到属性

javascript - 如何向 img 元素添加多个类