Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.03.2017, 12:04
Аспирант
Отправить личное сообщение для diga Посмотреть профиль Найти все сообщения от diga
 
Регистрация: 13.01.2016
Сообщений: 57

Организация очередей с использованием Deferred Object
Есть функция, которая отправляет некоторое сообщение на сервер, после успешной обработки сервер возвращает некий номер, который присваивается следующему сообщению при вызове этой функции. Проблема была следующей: при многократном вызове этой самой функции сообщения отправлялись сразу, сервер принимал и делал проверку номера, если номер сообщения не равен сохраненному номеру сервером то выдавал ошибку. А оно так и получалось, после отправки сообщения сервер не успевал вернуть текущий номер клиенту чтоб присвоить этот номер для следующего сообщения, следующее сообщение отправлялось сразу без нового номера, для решения этой проблемы было решено сделать очереди с использованием Deferred объекта

есть функция инициализации
initialize: function () {
            this.message_ids = [];
            this.message_ready = $.when();
        }

и функция отправки

send: function(message){
            var self = this;
            this.message_ids = this.message_ids.concat(message);
            this.message_ready = this.message_ready.then(function(){
                      var msg = _.uniq(self.message_ids.splice(0));
                        return self.send_to_server(msg).then(function (number) {
                            self.new_message_number = number;
                        }).fail(function () {
                            self.message_ids = self.message_ids.concat(msg);
                        });
                    });
                }
            });
            return this.message_ready;
        },


данная функция делает следующее: при каждом вызове функции сообщение message добавляется в очередь, и каждое сообщение отправляется когда message_ready срабатывает done, если сработало fail у send_to_server то данное сообщение обратно добавляется в очередь и при следующих вызовах всегда будет fail у message_ready. То есть я больше не смогу отправлять сообщение, как можно это все исправить?

P.s. извиняюсь за объем текста, хотел более понятно объяснить что я хочу.

UPD:
добавляю для then обработчик в случае fail
function(){
                var next = $.Deferred();
                this.message_ready = next;
                next.resolve();
                return next.resolve();
}


и переприсваиваю, работает в принципе норм, но что то мне подсказывает что так тоже не правильно

Последний раз редактировалось diga, 08.03.2017 в 13:51.
Ответить с цитированием
  #2 (permalink)  
Старый 08.03.2017, 19:18
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Я так и не понял: если некоторое сообщение отправилось неудачно (например, интернет сбойнул или ошибка на сервере), то что делать? Пытаться снова отправить с тем же номером? Или забить на него, а тот-же номер использовать для следующего сообщения?

Если второе, то вот набросок с промисами. Я рекомендую стандартные промисы вместо всяких дефередов.

var promise = Promise.resolve(startMsgId);

function send(msg) {
  var oldId;
  promise = promise.then(function (id) {
    return sendToServer(oldId = id, msg);
  }).catch(function (err) {
    return oldId;
  });
}


Предполагается, что sendToServer возвращает промис, который зарезолвится новым id. А если зареджектится, то возвращаем oldId - тот, каторый использовали для запроса.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Борьба с Object.defineProperty в IE8 FINoM Оффтопик 46 04.09.2012 23:45