5

次のような ajax または websocket 要求キューを処理するための JavaScript クライアント側ライブラリを探しています。

  • ユーザーがオンラインでサーバーが起動しているときにリクエストを直接送信する
  • ユーザーがオフラインのとき、またはサーバーがダウンしているときに、ローカル ストレージを使用してリクエストを保存する
  • ユーザーがオンラインでサーバーがオンラインに戻ったときに、保存されたリクエストを送信する

理想的には :

  • jqueryなし
  • 一緒に行くサーバーサイドコンポーネントも探しています

私はこのようなものを見つけることができません。たとえば、localstorage、window.navigator.onLine、および socket.io を使用して自分でビルドする必要がありますか、それともその目的のための lib が既にありますか?

ありがとう。

4

1 に答える 1

5

ライブラリを要求することは通常 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 行程度)。

于 2013-09-09T15:56:20.407 に答える