diff --git a/examples/vector-osm.js b/examples/vector-osm.js index 8dd778508b..5834ef230e 100644 --- a/examples/vector-osm.js +++ b/examples/vector-osm.js @@ -95,7 +95,7 @@ var vectorSource = new ol.source.ServerVector({ var url = 'http://overpass-api.de/api/xapi?map?bbox=' + epsg4326Extent.join(','); $.ajax(url).then(function(response) { - vectorSource.readFeatures(response); + vectorSource.addFeatures(vectorSource.readFeatures(response)); }); }, strategy: ol.loadingstrategy.createTile(new ol.tilegrid.XYZ({ diff --git a/src/ol/source/formatvectorsource.js b/src/ol/source/formatvectorsource.js index cb7d08dfb9..3b3ad39fd6 100644 --- a/src/ol/source/formatvectorsource.js +++ b/src/ol/source/formatvectorsource.js @@ -40,62 +40,18 @@ ol.source.FormatVector = function(options) { */ this.format = options.format; - /** - * @protected - * @type {function(Event)} - */ - this.handleXhrIo = goog.bind(this.handleXhrIo_, this); - }; goog.inherits(ol.source.FormatVector, ol.source.Vector); -/** - * @param {Event} event Event. - * @private - */ -ol.source.FormatVector.prototype.handleXhrIo_ = function(event) { - var xhrIo = event.target; - goog.asserts.assertInstanceof(xhrIo, goog.net.XhrIo); - if (xhrIo.isSuccess()) { - var type = this.format.getType(); - /** @type {ArrayBuffer|Document|Node|Object|string|undefined} */ - var source; - if (type == ol.format.FormatType.BINARY && - ol.BrowserFeature.HAS_ARRAY_BUFFER) { - source = xhrIo.getResponse(); - goog.asserts.assertInstanceof(source, ArrayBuffer); - } else if (type == ol.format.FormatType.JSON) { - source = xhrIo.getResponseText(); - } else if (type == ol.format.FormatType.TEXT) { - source = xhrIo.getResponseText(); - } else if (type == ol.format.FormatType.XML) { - if (!goog.userAgent.IE) { - source = xhrIo.getResponseXml(); - } - if (!goog.isDefAndNotNull(source)) { - source = ol.xml.load(xhrIo.getResponseText()); - } - } else { - goog.asserts.fail(); - } - if (goog.isDefAndNotNull(source)) { - this.readFeatures(source); - } else { - this.setState(ol.source.State.ERROR); - goog.asserts.fail(); - } - } else { - this.setState(ol.source.State.ERROR); - } - goog.dispose(xhrIo); -}; - - /** * @param {goog.Uri|string} url URL. + * @param {function(this: T, Array.)} callback Callback. + * @param {T} thisArg Value to use as `this` when executing `callback`. + * @template T */ -ol.source.FormatVector.prototype.loadFeaturesFromURL = function(url) { +ol.source.FormatVector.prototype.loadFeaturesFromURL = + function(url, callback, thisArg) { var xhrIo = new goog.net.XhrIo(); var type = this.format.getType(); var responseType; @@ -107,13 +63,55 @@ ol.source.FormatVector.prototype.loadFeaturesFromURL = function(url) { responseType = goog.net.XhrIo.ResponseType.TEXT; } xhrIo.setResponseType(responseType); - goog.events.listen(xhrIo, goog.net.EventType.COMPLETE, this.handleXhrIo); + goog.events.listen(xhrIo, goog.net.EventType.COMPLETE, + /** + * @param {Event} event Event. + * @private + * @this {ol.source.FormatVector} + */ + function(event) { + var xhrIo = event.target; + goog.asserts.assertInstanceof(xhrIo, goog.net.XhrIo); + if (xhrIo.isSuccess()) { + var type = this.format.getType(); + /** @type {ArrayBuffer|Document|Node|Object|string|undefined} */ + var source; + if (type == ol.format.FormatType.BINARY && + ol.BrowserFeature.HAS_ARRAY_BUFFER) { + source = xhrIo.getResponse(); + goog.asserts.assertInstanceof(source, ArrayBuffer); + } else if (type == ol.format.FormatType.JSON) { + source = xhrIo.getResponseText(); + } else if (type == ol.format.FormatType.TEXT) { + source = xhrIo.getResponseText(); + } else if (type == ol.format.FormatType.XML) { + if (!goog.userAgent.IE) { + source = xhrIo.getResponseXml(); + } + if (!goog.isDefAndNotNull(source)) { + source = ol.xml.load(xhrIo.getResponseText()); + } + } else { + goog.asserts.fail(); + } + if (goog.isDefAndNotNull(source)) { + callback.call(thisArg, this.readFeatures(source)); + } else { + this.setState(ol.source.State.ERROR); + goog.asserts.fail(); + } + } else { + this.setState(ol.source.State.ERROR); + } + goog.dispose(xhrIo); + }, false, this); xhrIo.send(url); }; /** * @param {ArrayBuffer|Document|Node|Object|string} source Source. + * @return {Array.} Features. */ ol.source.FormatVector.prototype.readFeatures = function(source) { var format = this.format; @@ -133,6 +131,5 @@ ol.source.FormatVector.prototype.readFeatures = function(source) { } } } - this.addFeaturesInternal(features); - this.setState(ol.source.State.READY); + return features; }; diff --git a/src/ol/source/staticvectorsource.js b/src/ol/source/staticvectorsource.js index e13de2eef4..6ebc8ad278 100644 --- a/src/ol/source/staticvectorsource.js +++ b/src/ol/source/staticvectorsource.js @@ -23,35 +23,51 @@ ol.source.StaticVector = function(options) { }); if (goog.isDef(options.arrayBuffer)) { - this.readFeatures(options.arrayBuffer); + this.addFeaturesInternal(this.readFeatures(options.arrayBuffer)); } if (goog.isDef(options.doc)) { - this.readFeatures(options.doc); + this.addFeaturesInternal(this.readFeatures(options.doc)); } if (goog.isDef(options.node)) { - this.readFeatures(options.node); + this.addFeaturesInternal(this.readFeatures(options.node)); } if (goog.isDef(options.object)) { - this.readFeatures(options.object); + this.addFeaturesInternal(this.readFeatures(options.object)); } if (goog.isDef(options.text)) { - this.readFeatures(options.text); + this.addFeaturesInternal(this.readFeatures(options.text)); } if (goog.isDef(options.url) || goog.isDef(options.urls)) { this.setState(ol.source.State.LOADING); if (goog.isDef(options.url)) { - this.loadFeaturesFromURL(options.url); + this.loadFeaturesFromURL(options.url, + /** + * @param {Array.} features Features. + * @this {ol.source.StaticVector} + */ + function(features) { + this.addFeaturesInternal(features); + this.setState(ol.source.State.READY); + }, this); } if (goog.isDef(options.urls)) { var urls = options.urls; var i, ii; for (i = 0, ii = urls.length; i < ii; ++i) { - this.loadFeaturesFromURL(urls[i]); + this.loadFeaturesFromURL(urls[i], + /** + * @param {Array.} features Features. + * @this {ol.source.StaticVector} + */ + function(features) { + this.addFeaturesInternal(features); + this.setState(ol.source.State.READY); + }, this); } } }