Отправка сообщений в очереди с помощью Prototype.AJAX - PullRequest
0 голосов
/ 09 августа 2010

Есть ли лучший шаблон для реализации очереди для отправки заказанных запросов?Я знаю, что это противоречит логике асинхронных запросов, но в особых случаях требуется отправка в очередь:)

Вот моя первая попытка:

this.queue = [],
this.sending = false,  
send: function(message) {
    if (this.sending) {
        this.queue.push(message);
    } else {
        else this.push(message);
    }
},
push: function(message) {
    this.sending = true;
    new Ajax.Request(this.outURL + "&message=" + encodeURIComponent(message), {
        onSuccess: function() {
            this.sending = false;
            if (this.queue.size() > 0) {
                this.push("queued: " + this.queue.shift());
            }
        }.bind(this)
    });
},

Есть ли лучшая реализация?Заранее спасибо:)

1 Ответ

0 голосов
/ 19 августа 2010

Не умирай в одиночестве !! Я думаю, что ваш класс / пространство имен может быть немного запутано, так как вы смешиваете: и = (вы не можете использовать = внутри пространства имен {} объекта)

AjaxQueue = {
    outURL: '/ajax.html',
    queue: [],
    sending: false,

    //Stick message on the queue array
    send: function(message) {
        this.queue.push(message);
        this.iterate();
    },
    //If theres a message on the queue array send it, then recursively calls itself
    iterate: function() {
        message = this.queue.pop()
        //this will be false and stop recursion when there are no more messages
        if (message)
        {
            new Ajax.Request(this.outURL, {
                //no need to use string appending or encodeURL, prototype does this for you
                parameters: {message: message},
                method: 'GET',
                onSuccess: function() {
                    //recursion.  We avoid this because it wont be in scope
                    AjaxQueue.iterate()
                }
            });
        }
    }
}

Код для проверки

AjaxQueue.send('First Message'); AjaxQueue.send('Second message'); AjaxQueue.send('Third Message')

Попробуйте это с очень большим файлом или медленным скриптом, и вы увидите, что функционирование очереди работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...