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:
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()
};
}