#javascript #ajax #google-visualization #google-query-language
#javascript #аякс #google-визуализация #google-query-language #ajax
Вопрос:
Я работаю над интерфейсом, который содержит несколько высокоинтенсивных SQL-запросов, затем отображает несколько диаграмм Google, которые в настоящее время вызываются через AJAX с использованием google.visualization.Объект запроса:
var query = new google.visualization.Query('/report.ashx');
query.send(callbackMethod);
//....
function callbackMethod(rs){
var data = rs.getDataTable();
var graph = new google.visualization.AreaChart(target_div);
graph.draw(data);
}
Поскольку интерфейс можно фильтровать динамически, я столкнулся со сценарием, в котором может выполняться запрос, в то время как пользователь потенциально может выбрать повторную фильтрацию и, следовательно, повторно запросить источник данных. Если первый запрос все еще выполняется, а второй запрос начинается и возвращается до первого запроса, то диаграмма будет отрисована просто отлично. Однако, когда первый запрос, наконец, завершится, он может полностью перезаписать диаграмму старыми данными, игнорируя текущие фильтры.
Я читал, что есть возможность передать объект jQuery AJAX, который предоставляет объект XHR, позволяющий мне вызвать .abort() в XHR, который отменит запрос (хотя это все равно будет обрабатываться на сервере, но это удар, который я готов принять). К сожалению, я не могу найти примеров этого, и документация Google менее чем полезна в этом отношении. Кто-нибудь сталкивался с тем же, и если да — решили ли они проблему?
Приветствия,
Крис.
Комментарии:
1. или передать временную метку запроса в
onSuccess
и не обновлять диаграмму, если данные устарели?2. «report.ashx» возвращает данные в формате: google.visualization. Query.setResponse({«версия»:»0.6″,»Запрос»:»22″… Так что не уверен, как я мог бы сравнить временные метки с этим.
Ответ №1:
Вы можете обернуть callbackMethod
в функцию более высокого порядка, чтобы отслеживать время запроса, и использовать query.send(callback())
вместо query.send(callbackMethod)
.
var mostRecentReqTime;
var callback = function() {
var reqTime = Date();
return function() {
if (reqTime < mostRecentReqTime) return;
var data = rs.getDataTable();
var graph = new google.visualization.AreaChart(target_div);
graph.draw(data);
mostRecentReqTime = reqTime;
};
};
Комментарии:
1. Спасибо за это @Fabricator, я буду иметь это в виду, однако я действительно ищу решение, которое позволило бы полностью отменить запрос.