X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/101642af08f7dbf4247394f0799995e486187ddf..00108bc9b7e9e03a47d89343e7f53eb924977ff8:/app/assets/javascripts/index/layers/data.js diff --git a/app/assets/javascripts/index/layers/data.js b/app/assets/javascripts/index/layers/data.js index 7e4b2d256..8925cc480 100644 --- a/app/assets/javascripts/index/layers/data.js +++ b/app/assets/javascripts/index/layers/data.js @@ -1,6 +1,6 @@ OSM.initializeDataLayer = function (map) { - var loadedBounds; - var dataLayer = map.dataLayer; + let dataLoader, loadedBounds; + const dataLayer = map.dataLayer; dataLayer.setStyle({ way: { @@ -32,13 +32,15 @@ OSM.initializeDataLayer = function (map) { }); dataLayer.on("remove", function () { + if (dataLoader) dataLoader.abort(); + dataLoader = null; map.off("moveend", updateData); $("#browse_status").empty(); map.fire("overlayremove", { layer: this }); }); function updateData() { - var bounds = map.getBounds(); + const bounds = map.getBounds(); if (!loadedBounds || !loadedBounds.contains(bounds)) { getData(); } @@ -75,27 +77,32 @@ OSM.initializeDataLayer = function (map) { .text(I18n.t("browse.start_rjs.feature_error", { message: message })))); } - var dataLoader; - function getData() { - var bounds = map.getBounds(); - var url = "/api/" + OSM.API_VERSION + "/map?bbox=" + bounds.toBBoxString(); + const bounds = map.getBounds(); + const url = "/api/" + OSM.API_VERSION + "/map.json?bbox=" + bounds.toBBoxString(); /* * Modern browsers are quite happy showing far more than 100 features in - * the data browser, so increase the limit to 4000 by default. + * the data browser, so increase the limit to 4000. */ const maxFeatures = 4000; if (dataLoader) dataLoader.abort(); - dataLoader = $.ajax({ - url: url, - dataType: "json", - success: function (data) { + dataLoader = new AbortController(); + fetch(url, { signal: dataLoader.signal }) + .then(response => { + if (response.ok) return response.json(); + const status = response.statusText || response.status; + if (response.status !== 400) throw new Error(status); + return response.text().then(text => { + throw new Error(text || status); + }); + }) + .then(function (data) { dataLayer.clearLayers(); - var features = dataLayer.buildFeatures(data); + const features = dataLayer.buildFeatures(data); function addFeatures() { $("#browse_status").empty(); @@ -116,26 +123,15 @@ OSM.initializeDataLayer = function (map) { if (map._objectLayer) { map._objectLayer.bringToFront(); } + }) + .catch(function (error) { + if (error.name === "AbortError") return; - dataLoader = null; - }, - error: function (XMLHttpRequest, textStatus) { - dataLoader = null; - if (textStatus === "abort") { return; } - - function closeError() { + displayLoadError(error?.message, () => { $("#browse_status").empty(); - } - - if (XMLHttpRequest.status === 400 && XMLHttpRequest.responseText) { - displayLoadError(XMLHttpRequest.responseText, closeError); - } else if (XMLHttpRequest.statusText) { - displayLoadError(XMLHttpRequest.statusText, closeError); - } else { - displayLoadError(String(XMLHttpRequest.status), closeError); - } - } - }); + }); + }) + .finally(() => dataLoader = null); } function onSelect(layer) {