Merge pull request #674 from alphagov/js-updater-update

Improve AJAX behaviour when server is slow/erroring
This commit is contained in:
Chris Hill-Scott
2016-06-13 11:31:38 +01:00
committed by GitHub
5 changed files with 43 additions and 42 deletions

View File

@@ -1,48 +1,49 @@
(function(GOVUK, Modules) {
(function(Modules) {
"use strict";
GOVUK.timeCache = {};
GOVUK.resultCache = {};
var queues = {};
var dd = new diffDOM();
let getter = function(resource, interval, render) {
var getRenderer = $component => response => dd.apply(
$component.get(0),
dd.diff($component.get(0), $(response[$component.data('key')]).get(0))
);
if (
GOVUK.resultCache[resource] &&
(Date.now() < GOVUK.timeCache[resource])
) {
render(GOVUK.resultCache[resource]);
} else {
GOVUK.timeCache[resource] = Date.now() + interval;
$.get(
resource,
response => render(GOVUK.resultCache[resource] = response)
);
}
var getQueue = resource => (
queues[resource] = queues[resource] || []
);
var flushQueue = function(queue, response) {
while(queue.length) queue.shift()(response);
};
let poller = (resource, key, $component, interval) => () => getter(
resource, interval, response => dd.apply(
$component.get(0),
dd.diff($component.get(0), $(response[key]).get(0))
)
);
var clearQueue = queue => (queue.length = 0);
var poll = function(renderer, resource, queue, interval) {
if (queue.push(renderer) === 1) $.ajax(
resource
).done(
response => flushQueue(queue, response)
).fail(
() => clearQueue(queue)
);
setTimeout(
() => poll(...arguments), interval
);
};
Modules.UpdateContent = function() {
this.start = function(component) {
this.start = component => poll(
getRenderer($(component)),
$(component).data('resource'),
getQueue($(component).data('resource')),
($(component).data('interval-seconds') || 1.5) * 1000
);
const $component = $(component);
interval = ($(component).data("interval-seconds") * 1000) || 1500;
setInterval(
poller($component.data('resource'), $component.data('key'), $component, interval),
interval / 5
);
};
};
})(window.GOVUK, window.GOVUK.Modules);
})(window.GOVUK.Modules);

View File

@@ -2,9 +2,9 @@
<div
{% if not finished %}
{#data-module="update-content"
data-module="update-content"
data-resource="{{url_for(".view_job_updates", service_id=current_service.id, job_id=job.id)}}"
data-key="counts"#}
data-key="counts"
aria-live="polite"
{% endif %}
>

View File

@@ -2,9 +2,9 @@
<div
{% if not finished %}
{#data-module="update-content"
data-module="update-content"
data-resource="{{url_for(".view_job_updates", service_id=current_service.id, job_id=job.id)}}"
data-key="notifications"#}
data-key="notifications"
aria-live="polite"
{% endif %}
>

View File

@@ -1,8 +1,8 @@
<div
{% if not finished %}
{#data-module="update-content"
data-module="update-content"
data-resource="{{url_for(".view_job_updates", service_id=current_service.id, job_id=job.id)}}"
data-key="status"#}
data-key="status"
aria-live="polite"
{% endif %}
>

View File

@@ -4,10 +4,10 @@
{% from "components/table.html" import list_table, field, right_aligned_field_heading, hidden_field_heading %}
<div
{#data-module="update-content"
data-module="update-content"
data-resource="{{url_for(".service_dashboard_updates", service_id=current_service.id)}}"
data-key="today"
data-interval-seconds="2"#}
data-interval-seconds="2"
aria-live="polite"
>
<div class="grid-row">