@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 2.92 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import t from"../../core/Error.js";import e from"../../core/Logger.js";import{isAborted as s,createAbortError as r,isPromiseLike as o,isAbortError as a}from"../../core/promiseUtils.js";import{signal as n}from"../../core/signal.js";import{Yield as i}from"./Yield.js";class c{constructor(){this._tasks=new Array,this._numPendingTasks=n(0),this._readyToRun=n(!1)}get length(){return this._tasks.length}get updating(){return this._numPendingTasks.value>0}get readyToRun(){return this._readyToRun.value}_updateReadyToRun(){this._readyToRun.value=this._tasks.length>0}destroy(){this.cancelAll()}runTask(t){if(0===this.length)return i;for(;!t.done&&this._process(t);)t.madeProgress()}push(t,e,s){return this._addTask((r,o)=>new p(r,o,t,e,s),Array.prototype.push)}unshift(t,e,s){return this._addTask((r,o)=>new p(r,o,t,e,s),Array.prototype.unshift)}pushGenerator(t,e,s){return this._addTask((r,o)=>new _(r,o,t,e,s),Array.prototype.push)}_process(t){if(0===this._tasks.length)return!1;const e=this._tasks.shift();this._updateReadyToRun();try{if(s(e.signal))this._cancelTask(e,r());else switch(e.type){case 0:this._processSimple(e,t);break;case 1:this._processGenerator(e,t);break;case 2:this._processIterator(e,t)}}catch(o){e.reject(o)}return!0}cancelAll(){const t=r();for(const e of this._tasks)this._cancelTask(e,t);this._tasks.length=0,this._updateReadyToRun()}_cancelTask(t,e){if(t.abortCallback){const s=t.abortCallback(e);2===t.type&&t.iterator.return&&h(t.iterator.return()),o(s)?s.then(t.resolve,t.reject):t.resolve(s)}else 2===t.type&&t.iterator.throw&&h(t.iterator.throw(e)),t.reject(e)}_onIteratorResult(t,e){e.done?t.resolve(e.value):(this._tasks.unshift(t),this._updateReadyToRun())}_processSimple(t,e){const s=t.callback(e);o(s)?s.then(t.resolve,t.reject):t.resolve(s)}_processGenerator(t,e){const s=t.generatorFunction(e),r=new d(t.resolve,t.reject,s,t.signal,t.abortCallback);this._processIterator(r,e)}_processIterator(t,e){const s=t.iterator.next(e);o(s)?s.then(e=>this._onIteratorResult(t,e),t.reject):this._onIteratorResult(t,s)}_addTask(t,e){return new Promise((s,r)=>{const o=t(s,r);e.call(this._tasks,o),++this._numPendingTasks.value,this._updateReadyToRun()}).finally(()=>--this._numPendingTasks.value)}}function h(t){o(t)?t.then(l,l):l(t)}function l(s){a(s)||s instanceof Error||s instanceof t||null!=s&&"object"==typeof s&&"done"in s&&s.done||e.getLogger("esri.layers.support.PromiseQueue").warn("Generator iterator was aborted, but it is not done.")}class u{constructor(t,e,s,r){this.resolve=t,this.reject=e,this.signal=s,this.abortCallback=r}}class p extends u{constructor(t,e,s,r,o){super(t,e,r,o),this.callback=s,this.type=0}}class _ extends u{constructor(t,e,s,r,o){super(t,e,r,o),this.generatorFunction=s,this.type=1}}class d extends u{constructor(t,e,s,r,o){super(t,e,r,o),this.iterator=s,this.type=2}}export{c as PromiseQueue};