Обтекание запросов синхронизации Backbone - PullRequest
3 голосов
/ 14 февраля 2012

Я пишу приложение Backbone, и мне нужно предлагать пользователям обратную связь всякий раз, когда делается запрос к серверу (я знаю, это раздражает, но я не могу контролировать это поведение приложения). Бэкэнд всегда сообщает информативное (по крайней мере, теоретически) сообщение с каждым ответом, например

{
  "status":"error",
  "message":"something went really wrong"
}

или

{
  "status":"success",
  "message":"congratulations",
  "data":{...}
}

Что я хотел бы понять, так это где поставить хук для какой-либо службы обмена сообщениями.

Одной из возможностей является метод parse() для моделей и коллекций. Чтобы избежать дублирования, я должен был бы поместить его в некоторый базовый класс модели. Это все еще немного раздражает, так как все модели и коллекции в любом случае имеют свои parse().

Более разумное место - функция Backbone.sync. Но я не хочу перезаписывать его, вместо этого я бы хотел обернуть его внутри какой-нибудь другой вспомогательной функции. Проблема здесь в том, что я не могу найти хороший хук, куда помещать некоторую логику для выполнения с каждым запросом.

Есть ли у вас какие-либо предложения о том, как организовать какую-то часть логики, которая будет выполняться с каждым запросом?

Ответы [ 2 ]

7 голосов
/ 14 февраля 2012

Поскольку Backbone.sync возвращает то, что возвращает $.ajax, легко достичь того, чего я хочу, с помощью делегатов jQuery, например,

var originalMethod = Backbone.sync;

Backbone.sync = function(method, model, options) {
    var request = originalMethod.call(Backbone, method, model, options);

    request.done(function(msg) {
        console.log(msg);
    });
    request.fail(function(jqXHR, textStatus) {
        console.log(jqXHR, textStatus);
    });
    return request;
};
3 голосов
/ 14 февраля 2012

Если вы используете недавний (> 1.5) jquery, все результаты синхронизации вернут обещание $.ajax.Тогда вы можете сделать это, не перекрывая ничего синхронно, используя это обещание.Например, если вы сделали fetch (), вы могли бы сделать:

var p = mymodel.fetch();
p.done(function (res) { ... });
p.fail(function (err) { ... });

Конечно, вы также можете использовать обратные вызовы в опциях извлечения, но я считаю, что приведенное выше намного чище.Тот же самый шаблон применяется для, скажем, сохранения или всего, что использует синхронизацию.

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