nakarte

Source code of https://map.sikmir.ru (fork)
git clone git://git.sikmir.ru/nakarte
Log | Files | Refs | LICENSE

commit 996903d2c1b24248febaad6dda435cec90d72927
parent 0cfbf2314b7a5461785538b825c787ba741aa758
Author: Sergey Orlov <wladimirych@gmail.com>
Date:   Thu,  2 Jul 2020 22:44:19 +0200

tiled-data-loader: handle XHR errors. Fixes #413

Diffstat:
Msrc/lib/leaflet.control.panoramas/lib/mapillary/mapillary-coverage-layer.js | 3++-
Msrc/lib/leaflet.control.panoramas/lib/wikimedia/coverage-layer.js | 3++-
Msrc/lib/leaflet.layer.wikimapia/index.js | 3++-
Msrc/lib/tiled-data-loader/index.js | 34++++++++++++++++++++--------------
4 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/src/lib/leaflet.control.panoramas/lib/mapillary/mapillary-coverage-layer.js b/src/lib/leaflet.control.panoramas/lib/mapillary/mapillary-coverage-layer.js @@ -141,6 +141,7 @@ const MapillaryCoverage = L.GridLayer.extend({ canvas.height = this.options.tileSize; let {dataPromise, abortLoading} = this.loader.requestTileData(coords); dataPromise.then((data) => { + if (!data.error) { canvas._tileData = data.tileData; canvas._adjustment = data.adjustment || {multiplier: 1, offsetX: 0, offsetY: 0}; setTimeout(() => { @@ -148,7 +149,7 @@ const MapillaryCoverage = L.GridLayer.extend({ done(null, canvas); }, 1); } - ); + }); canvas._abortLoading = abortLoading; return canvas; }, diff --git a/src/lib/leaflet.control.panoramas/lib/wikimedia/coverage-layer.js b/src/lib/leaflet.control.panoramas/lib/wikimedia/coverage-layer.js @@ -161,6 +161,7 @@ const WikimediaVectorCoverage = L.GridLayer.extend({ canvas.height = this.options.tileSize; let {dataPromise, abortLoading} = this.loader.requestTileData(coords); dataPromise.then((data) => { + if (!data.error) { canvas._tileData = data.tileData; canvas._adjustment = data.adjustment || {multiplier: 1, offsetX: 0, offsetY: 0}; setTimeout(() => { @@ -168,7 +169,7 @@ const WikimediaVectorCoverage = L.GridLayer.extend({ done(null, canvas); }, 1); } - ); + }); canvas._abortLoading = abortLoading; return canvas; diff --git a/src/lib/leaflet.layer.wikimapia/index.js b/src/lib/leaflet.layer.wikimapia/index.js @@ -103,12 +103,13 @@ L.Wikimapia = L.GridLayer.extend({ canvas.height = this.options.tileSize; let {dataPromise, abortLoading} = this.loader.requestTileData(coords); dataPromise.then((data) => { + if (!data.error) { canvas._tileData = data.tileData; canvas._adjustment = data.adjustment; this.drawTile(canvas); this._tileOnLoad(done, canvas); } - ); + }); canvas._abortLoading = abortLoading; return canvas; diff --git a/src/lib/tiled-data-loader/index.js b/src/lib/tiled-data-loader/index.js @@ -78,18 +78,19 @@ class TiledDataLoader { if (!(dataTileKey in this._pendingRequests)) { const {url, options} = this.makeRequestData(dataTileCoords); const fetchPromise = this._xhrQueue.put(url, options); - // TODO: handle errors - const dataPromise = fetchPromise - .then((xhr) => this.processResponse(xhr, dataTileCoords)) - .then(({tileData, coords}) => { - this._cache.put(this.makeTileKey(coords), tileData); - delete this._pendingRequests[dataTileKey]; - return { - tileData, - coords - }; - } - ); + const dataPromise = (async() => { + let xhr; + try { + xhr = await fetchPromise; + } catch (e) { + return {error: e}; + } finally { + delete this._pendingRequests[dataTileKey]; + } + const {tileData, coords} = await this.processResponse(xhr, dataTileCoords); + this._cache.put(this.makeTileKey(coords), tileData); + return {tileData, coords}; + })(); const pendingRequest = this._pendingRequests[dataTileKey] = { dataPromise, refCount: 0 @@ -107,11 +108,16 @@ class TiledDataLoader { pendingRequest.refCount += 1; return { - dataPromise: pendingRequest.dataPromise.then((data) => ({ + dataPromise: pendingRequest.dataPromise.then((data) => { + if (data.error) { + return data; + } + return { coords: data.coords, tileData: data.tileData, adjustment: this.calcAdjustment(layerTileCoords, data.coords) - })), + }; + }), abortLoading: () => pendingRequest.abortLoading() }; }