У меня есть базовое приложение, которое имеет несколько просмотров. Переключение между представлениями запускает запросы Ajax для получения разных коллекций. Я хотел бы остановить текущий запрос ajax «чтение», если запущен новый. Является ли это возможным?
Можно ли остановить запросы на чтение Backbone
Ответы (3)
Итак, вот что я сделал
Я сохраняю запросы на выборку в переменной
app.fetchXhr = this.model.fetch();
В моем маршрутизаторе у меня есть функция, которая заботится о закрытии представлений и отображении представлений. Он также заботится о запуске любых триггеров, необходимых для каждого изменения представления, но это не имеет отношения к этому вопросу.
Прежде чем что-либо делать, эта функция маршрутизатора выполняет следующее
//Stop pending fetch
if(app.fetchXhr.readyState > 0 && app.fetchXhr.readyState < 4){
app.fetchXhr.abort();
}
надеюсь, это поможет
Еще один поздний ответ на случай, если кто-то еще столкнется с этим.
В итоге я перезаписал Backbone.sync, чтобы добавить пул объектов XHR и возможность прерывать ожидающие запросы при выборке.
var sync = Backbone.sync
, xhrPool = [];
Backbone.sync = function(method, model, options) {
options = options || {};
if (method === 'read') {
if (options.abortPending == true) {
for (var i = 0; i < xhrPool.length; i++) {
if (xhrPool[i]['readyState'] > 0 && xhrPool[i]['readyState'] < 4) {
xhrPool[i].abort();
xhrPool.splice(i, 1);
}
}
}
// cleanup xhrPool
// todo: make removal from the pool an 'always' jqXHR callback
// instead of cleanup on every read?
for (var i = 0; i < xhrPool.length; i++) {
if (xhrPool[i]['readyState'] === 4) {
xhrPool.splice(i, 1);
}
}
var xhr = sync(method, model, options);
xhrPool.push(xhr);
return xhr;
} else {
return sync(method, model, options);
}
};
Я предполагаю, что вы используете магистраль с jQuery. Если это так, следующий вопрос, кажется, дает вам ответ:
Отменить запросы Ajax с помощью jQuery
Backbone fetch
возвращает xhr
, о котором они говорят, IIRC.