@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 3.13 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.33/esri/copyright.txt for details.
*/
import e from"../../core/Error.js";import{removeMaybe as r}from"../../core/maybe.js";import{createResolver as t,onAbort as i,throwIfAborted as l}from"../../core/promiseUtils.js";import a from"../../layers/Layer.js";function s(e){return"tryRecycleWith"in e}class o{constructor(r,l,a){this.layer=r,this.view=l,this.layerViewImporter=a,this._controller=new AbortController,this._deferred=t(),this._started=!1,this.done=!1,this.promise=this._deferred.promise,i(this._controller.signal,(()=>{this._recycleController?.abort();const t=new e("cancelled:layerview-create","layerview creation cancelled",{layer:r});this._deferred.reject(t)}))}tryRecycle(e){if(!this.done||!this.layerView||!s(this.layerView))return null;this._recycleController?.abort(),this._recycleController=new AbortController;const r=this.layer.type,t=this._recycleController.signal;for(let i=0;i<e.length;i++){const a=e[i];if(a.type!==r)continue;const s=this.layerView.tryRecycleWith(a,{signal:t});if(s){e.splice(i,1),this.layer=a;const r=this.layerView,o=r.view;return this.promise=s.then((()=>(l(t),a.emit("layerview-destroy",{view:o,layerView:r}),o.emit("layerview-destroy",{view:o,layerView:r}),a.emit("layerview-create",{view:o,layerView:r}),o.emit("layerview-create",{view:o,layerView:r}),r))),this.promise}}return null}destroy(){this._controller.abort();const{layerView:e}=this;if(e){const{layer:r,view:t}=this;r.emit("layerview-destroy",{view:t,layerView:e}),t.emit("layerview-destroy",{layer:r,layerView:e})}this.done=!0,this.layer=null,this.layerView=null,this.view=null,this.layerViewImporter=null,this._map=null,this.promise=null,this._deferred=null}async start(){const{view:t}=this;if(this._started||!t.map)return;this._started=!0;const{_controller:{signal:a},layer:s}=this;this._map=t.map;try{let y,w;if(await s.load({signal:a}),s.prefetchResources&&await s.prefetchResources({signal:a}),n(s))y=await s.createLayerView(t,{signal:a});else{if(!this.layerViewImporter.hasLayerViewModule(s))throw new e("layer:view-not-supported","No layerview implementation was found");const r=await this.layerViewImporter.importLayerView(s);l(a),y="default"in r?new r.default({layer:s,view:t}):new r({layer:s,view:t})}const c=()=>{w=r(w),y.destroyed||y.destroy(),y.layer=null,y.parent=null,y.view=null,this.done=!0};w=i(a,c),l(a);try{await y.when()}catch(o){throw c(),o}const h=this._map?.allLayers?.includes(s);if(!h)return c(),void this._deferred.reject(new e("view:no-layerview-for-layer","The layer has been removed from the map",{layer:s}));this.layerView=y,s.emit("layerview-create",{view:t,layerView:y}),t.emit("layerview-create",{layer:s,layerView:y}),this.done=!0,this._deferred.resolve(y)}catch(o){s.emit("layerview-create-error",{view:t,error:o}),t.emit("layerview-create-error",{layer:s,error:o}),this.done=!0,this._deferred.reject(new e("layerview:create-error","layerview creation failed",{layer:s,error:o}))}}}function n(e){return e.createLayerView!==a.prototype.createLayerView}export{o as LayerLayerViewInfo};