Запрос опроса для обновления моделей/видов Backbone
Мне нужно найти способ обновления веб-приложения, реализованного с помощью backbone
.
Вариант использования будет следующим:
У меня есть несколько видов, и каждый вид, или, возможно, модель/коллекция, связанные с этим представлением,
необходимо выполнить другой запрос опроса на сервер в разное время для обнаружения некоторых изменений.
Мне интересно, какой самый общий способ:
1) реализовать Traditional Polling Request
2) реализовать Long Polling Request
3) реализовать HTML5 web socket
P.S.:
1) Сервер написан на PHP.
2) На данный момент я ищу решение без использования HTML5 WebSockets, потому что, возможно, с PHP не так просто.
Здесь мой простой код (1) с помощью Traditional Polling Request
.
(1)
// MyModel
var MyModel = Backbone.View.extend({
urlRoot: 'backendUrl'
});
// MyView
var MyView = Backbone.View.extend({
initialize: function () {
this.model = new MyModel();
this.model.fetch();
this.model.on('change', this.render);
setTimeout(function () {
this.model.fetch();
}, 1000 * 60 * 2); // in order to update the view each two minutes
}
});
Ответы
Ответ 1
Внесите его в свою модель обработчик опроса, проверьте этот пример:
// MyModel
var MyModel = Backbone.Model.extend({
urlRoot: 'backendUrl',
//Add this to your model:
longPolling : false,
intervalMinutes : 2,
initialize : function(){
_.bindAll(this);
},
startLongPolling : function(intervalMinutes){
this.longPolling = true;
if( intervalMinutes ){
this.intervalMinutes = intervalMinutes;
}
this.executeLongPolling();
},
stopLongPolling : function(){
this.longPolling = false;
},
executeLongPolling : function(){
this.fetch({success : this.onFetch});
},
onFetch : function () {
if( this.longPolling ){
setTimeout(this.executeLongPolling, 1000 * 60 * this.intervalMinutes); // in order to update the view each N minutes
}
}
});
// MyView
var MyView = Backbone.View.extend({
initialize: function () {
this.model = new MyModel();
this.model.startLongPolling();
this.model.on('change', this.render);
}
});
Ответ 2
Я не уверен, что вы спрашиваете здесь, но вот некоторые мысли:
1) Ваш код, кажется, противоречит тому, что вы написали в названии. Использование setTimeout
(или setInterval
) для непрерывного опроса - это нечто иное, чем длительный опрос. На самом деле это (обычный) опрос. Разница в том, что при длительном опросе клиент запускает запрос AJAX, и он ждет. Сервер решает, когда ответить. И он должен отвечать только тогда, когда доступны новые данные. И сразу после ответа клиент начинает новый запрос опроса.
Боковое примечание: создание (относительно) эффективного сервера длинных опросов - непростая задача, помните об этом.
2) Как вы обрабатываете клиентскую часть (то есть, где вы ставите длинную логику опроса), на самом деле не имеет значения, если вы знаете, что происходит внутри вашего кода. Конечно, имейте в виду, что, возможно, в будущем вы хотели бы внести некоторые изменения в код, поэтому сохранить его отдельно, вероятно, будет лучшим выбором. Вот архитектура, которую я бы выбрал:
- Независимый script, который создает глобальный объект
EventManager
(этот script должен загружаться как первый). Такой объект будет иметь следующие методы: .bind
и .trigger
, и это будет... управлять событиями.:) Вот, например, как может выглядеть реализация:
Реализация событий в моем собственном объекте
- Независимый script, который обрабатывает длительный опрос. Всякий раз, когда данные принимаются с сервера (т.е. Длительный запрос опроса AJAX, наконец, заканчивается), он вызывает
EventManager.trigger('long_polling_data', res);
. Затем вам нужно привязать это событие внутри вашего позвоночника или где угодно.
Боковое примечание: дополнительный бонус с этой архитектурой заключается в том, что если вы решите переключиться на WebSockets или любой другой метод (например, опрос JSONP), вам нужно будет только реализовать логику для другой техники. Основной код будет использовать только событие long_polling_data
, поэтому никаких дополнительных изменений не потребуется (вы можете изменить имя события:]).
3) Хотя вы говорите, что не хотите использовать WebSockets, я должен прокомментировать это.:) Вы знаете, что мир постоянно развивается. Вы должны забыть о длинных методах опроса. Использование WebSockets и XMLSocket (a.k.a. FlashSocket) в качестве резервной копии намного более эффективно, и на стороне сервера намного проще реализовать.
Надеюсь, я немного помог, сожалею о любых языковых ошибках и удачи в вашем проекте!
Ответ 3
Я знаю, что вы задали в своем вопросе, что вы не хотите использовать веб файлы с php (из-за этого это не так просто), однако я нашел, что это относительно просто.
- Я использовал http://pusher.com/, который представляет собой приложение для веб-сокетов с резервными копиями. (Кстати, я не связан с компанией).
- включить https://github.com/squeeks/Pusher-PHP на сервере /api
- включить
<script src="http://js.pusherapp.com/1.12/pusher.min.js"></script>
на стороне клиента.
Клиентский и серверный канал можно настроить, чтобы разговаривать друг с другом с помощью веб-сокетов.