首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有javascript客户端库来排队具有存储支持的ajax请求?

是否有javascript客户端库来排队具有存储支持的ajax请求?
EN

Stack Overflow用户
提问于 2013-09-09 15:06:28
回答 1查看 1.5K关注 0票数 5

我正在寻找一个javascript客户端库来处理ajax或websocket请求队列,如下所示:

  • 当用户联机且服务器启动时,直接发送请求
  • 当用户脱机或服务器关闭时使用本地存储存储请求
  • 当用户联机和服务器重新联机时发送存储的请求

理想情况是:

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

我找不到这样的东西。我应该使用本地存储(例如window.navigator.onLine和socket.io )自己构建一个库,还是为此已经有了一些库?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-09 15:56:20

这个问题可能会被关闭,因为在StackOverflow上通常不欢迎请求一个库。然而,这是一个有趣的小挑战。(我花了15分钟完成。)

这实际上不是一个很大的任务,只有50行左右。这可能就是为什么你找不到一个小型的图书馆来做这个。

代码语言:javascript
运行
复制
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行左右)跟踪时间。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18701362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档