Ensure proper tile load sequence
This commit is contained in:
@@ -241,6 +241,9 @@ class Tile extends EventTarget {
|
|||||||
* @api
|
* @api
|
||||||
*/
|
*/
|
||||||
setState(state) {
|
setState(state) {
|
||||||
|
if (this.state !== TileState.ERROR && this.state > state) {
|
||||||
|
throw new Error('Tile load sequence violation');
|
||||||
|
}
|
||||||
this.state = state;
|
this.state = state;
|
||||||
this.changed();
|
this.changed();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import UrlTile from './UrlTile.js';
|
|||||||
import {getKeyZXY, getKey} from '../tilecoord.js';
|
import {getKeyZXY, getKey} from '../tilecoord.js';
|
||||||
import {createXYZ, extentFromProjection, createForProjection} from '../tilegrid.js';
|
import {createXYZ, extentFromProjection, createForProjection} from '../tilegrid.js';
|
||||||
import {buffer as bufferExtent, getIntersection, intersects} from '../extent.js';
|
import {buffer as bufferExtent, getIntersection, intersects} from '../extent.js';
|
||||||
import {listen, unlistenByKey} from '../events.js';
|
|
||||||
import EventType from '../events/EventType.js';
|
import EventType from '../events/EventType.js';
|
||||||
import {loadFeaturesXhr} from '../featureloader.js';
|
import {loadFeaturesXhr} from '../featureloader.js';
|
||||||
import {isEmpty} from '../obj.js';
|
import {isEmpty} from '../obj.js';
|
||||||
@@ -240,13 +239,15 @@ class VectorTile extends UrlTile {
|
|||||||
}
|
}
|
||||||
if (sourceTile.getState() !== TileState.EMPTY && tile.getState() === TileState.IDLE) {
|
if (sourceTile.getState() !== TileState.EMPTY && tile.getState() === TileState.IDLE) {
|
||||||
tile.loadingSourceTiles++;
|
tile.loadingSourceTiles++;
|
||||||
const key = listen(sourceTile, EventType.CHANGE, function() {
|
const onSourceTileChange = function() {
|
||||||
const state = sourceTile.getState();
|
const state = sourceTile.getState();
|
||||||
const sourceTileKey = sourceTile.getKey();
|
const sourceTileKey = sourceTile.getKey();
|
||||||
if (state === TileState.LOADED || state === TileState.ERROR) {
|
if (state === TileState.LOADED || state === TileState.ERROR) {
|
||||||
if (state === TileState.LOADED) {
|
if (state === TileState.LOADED) {
|
||||||
unlistenByKey(key);
|
sourceTile.removeEventListener(EventType.CHANGE, onSourceTileChange);
|
||||||
tile.loadingSourceTiles--;
|
tile.loadingSourceTiles--;
|
||||||
|
// eslint-disable-next-line no-use-before-define
|
||||||
|
tile.removeEventListener(EventType.CHANGE, onTileChange);
|
||||||
delete tile.errorSourceTileKeys[sourceTileKey];
|
delete tile.errorSourceTileKeys[sourceTileKey];
|
||||||
} else if (state === TileState.ERROR) {
|
} else if (state === TileState.ERROR) {
|
||||||
tile.errorSourceTileKeys[sourceTileKey] = true;
|
tile.errorSourceTileKeys[sourceTileKey] = true;
|
||||||
@@ -257,7 +258,15 @@ class VectorTile extends UrlTile {
|
|||||||
tile.setState(isEmpty(tile.errorSourceTileKeys) ? TileState.LOADED : TileState.ERROR);
|
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));
|
}.bind(this));
|
||||||
if (!covered) {
|
if (!covered) {
|
||||||
|
|||||||
@@ -74,7 +74,8 @@ describe('ol.renderer.canvas.VectorTileLayer', function() {
|
|||||||
source = new VectorTileSource({
|
source = new VectorTileSource({
|
||||||
format: new MVT(),
|
format: new MVT(),
|
||||||
tileClass: TileClass,
|
tileClass: TileClass,
|
||||||
tileGrid: createXYZ()
|
tileGrid: createXYZ(),
|
||||||
|
url: '{z}/{x}/{y}.pbf'
|
||||||
});
|
});
|
||||||
source.getSourceTiles = function() {
|
source.getSourceTiles = function() {
|
||||||
return [new TileClass([0, 0, 0])];
|
return [new TileClass([0, 0, 0])];
|
||||||
|
|||||||
Reference in New Issue
Block a user