Ensure proper tile load sequence

This commit is contained in:
Andreas Hocevar
2019-09-28 15:20:45 +02:00
parent 32644c7ba9
commit 7f8fdd6219
3 changed files with 18 additions and 5 deletions

View File

@@ -241,6 +241,9 @@ class Tile extends EventTarget {
* @api
*/
setState(state) {
if (this.state !== TileState.ERROR && this.state > state) {
throw new Error('Tile load sequence violation');
}
this.state = state;
this.changed();
}

View File

@@ -10,7 +10,6 @@ import UrlTile from './UrlTile.js';
import {getKeyZXY, getKey} from '../tilecoord.js';
import {createXYZ, extentFromProjection, createForProjection} from '../tilegrid.js';
import {buffer as bufferExtent, getIntersection, intersects} from '../extent.js';
import {listen, unlistenByKey} from '../events.js';
import EventType from '../events/EventType.js';
import {loadFeaturesXhr} from '../featureloader.js';
import {isEmpty} from '../obj.js';
@@ -240,13 +239,15 @@ class VectorTile extends UrlTile {
}
if (sourceTile.getState() !== TileState.EMPTY && tile.getState() === TileState.IDLE) {
tile.loadingSourceTiles++;
const key = listen(sourceTile, EventType.CHANGE, function() {
const onSourceTileChange = function() {
const state = sourceTile.getState();
const sourceTileKey = sourceTile.getKey();
if (state === TileState.LOADED || state === TileState.ERROR) {
if (state === TileState.LOADED) {
unlistenByKey(key);
sourceTile.removeEventListener(EventType.CHANGE, onSourceTileChange);
tile.loadingSourceTiles--;
// eslint-disable-next-line no-use-before-define
tile.removeEventListener(EventType.CHANGE, onTileChange);
delete tile.errorSourceTileKeys[sourceTileKey];
} else if (state === TileState.ERROR) {
tile.errorSourceTileKeys[sourceTileKey] = true;
@@ -257,7 +258,15 @@ class VectorTile extends UrlTile {
tile.setState(isEmpty(tile.errorSourceTileKeys) ? TileState.LOADED : TileState.ERROR);
}
}
});
};
const onTileChange = function() {
if (tile.getState() === TileState.ABORT) {
sourceTile.removeEventListener(EventType.CHANGE, onSourceTileChange);
tile.removeEventListener(EventType.CHANGE, onTileChange);
}
};
sourceTile.addEventListener(EventType.CHANGE, onSourceTileChange);
tile.addEventListener(EventType.CHANGE, onTileChange);
}
}.bind(this));
if (!covered) {