Опрос сервера с помощью Ajax и Dojo
-
20-09-2019 - |
Вопрос
я использую dojo.xhrPost для отправки Ajax-запросов
Вызов обернут function sendRequest()
Теперь мне нужно постоянно (каждые 3 секунды) отправлять на сервер одно и то же сообщение ajax.
Как я могу реализовать опрос сервера с помощью Dojo?Мне в принципе нужно позвонить sendRequest()
каждые 3 секунды
Решение
Я не верю, что в Dojo есть встроенный метод опроса, поэтому вот общий метод, применимый во всех средах.
var Poll = function(pollFunction, intervalTime) {
var intervalId = null;
this.start = function(newPollFunction, newIntervalTime) {
pollFunction = newPollFunction || pollFunction;
intervalTime = newIntervalTime || intervalTime;
if ( intervalId ) {
this.stop();
}
intervalId = setInterval(pollFunction, intervalTime);
};
this.stop = function() {
clearInterval(intervalId);
};
};
Использование:
var p = new Poll(function() { console.log("hi!"); }, 1000);
p.start();
setTimeout(function() { p.stop();}, 5000);
Или в вашем случае:
var p = new Poll(sendRequest, 3000);
p.start();
Если вам нужен пакет Dojo, то следующее тривиальное расширение:
dojo.provide("Poll");
dojo.declare("Poll", null, {
intervalId: null,
pollFunction: null,
intervalTime: null,
constructor: function(newPollFunction, newIntervalTime) {
this.pollFunction = newPollFunction;
this.intervalTime = newIntervalTime;
},
start: function(newPollFunction, newIntervalTime) {
this.pollFunction = newPollFunction || this.pollFunction;
this.intervalTime = newIntervalTime || this.intervalTime;
this.stop();
this.intervalId = setInterval(this.pollFunction, this.intervalTime);
},
stop: function() {
clearInterval(this.intervalId);
}
});
Использование:
var p = new Poll(function() {console.log("hi");}, 250);
p.start();
setTimeout(dojo.hitch(p, p.stop), 1000);
Другие советы
Я нашел, что лучше сделать так:
- Иметь переменную, содержащую пустой массив (очередь)
- setInterval для опроса, при каждом опросе помещать новый объект (с параметрами опроса) в массив (очередь);вы также можете сжимать опросы, сжимая объекты с одинаковыми параметрами в один объект;вы даже можете поместить в эти объекты функции-обработчики
- Иметь таймер для проверки очереди;если ничего, возвращает
- Если в очереди есть ожидающий объект, проверяется, существует ли уже ожидающая операция xhr, которая не вернулась, просто подождите - вы не хотите, чтобы одновременно ожидало слишком много xhr, некоторые устройства (например,iPad) задыхается от этого
- Если ожидающей операции xhr нет, исключите из очереди первый объект опроса и выполните xhrGet его.
Преимущество этой процедуры заключается в том, что вы можете легко регулировать интервалы опроса, отлично работает, когда истекает время определенных операций xhr, и можете легко реализовать приватизацию запросов опроса.
Чтобы постоянно обновлять сетку, вы можете включить свой ajax-запрос в функцию обратного вызова «обновление-завершение» сетки.
yourGrid.on('dgrid-refresh-complete', function(event) {
//Ajax request fireing every 3 sec
}