UNPKG

dom-observe

Version:

![npm](https://img.shields.io/npm/v/dom-observe?style=for-the-badge)![npm](https://img.shields.io/npm/dw/dom-observe?style=for-the-badge)![npm](https://img.shields.io/npm/dt/dom-observe?style=for-the-badge) ![node](https://img.shields.io/node/v/dom-observ

102 lines (101 loc) 3.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DOMDeferredSelector = void 0; const DeferredPromise_1 = require("../DeferredPromise"); const delay_me_1 = require("delay-me"); class DOMDeferredSelector { /** * @param {SelectorCallback<T>} selector * @param {IDOMDeferredSelectorParameters} parameters */ constructor(selector, parameters) { this._is_activated = false; this._is_cancelled = false; this._repeats_left = null; this._interval_ref = null; this.selector = selector; this.parameters = parameters; this._deferred = new DeferredPromise_1.DeferredPromise(); this._repeats_left = this.parameters.repeats; this.awaitElementProcess = this.awaitElementProcess.bind(this); } get isActivated() { return this._is_activated; } get isCancelled() { return this._is_cancelled; } /** * @param {SelectorCallback<T>} selector * @param {IDOMDeferredSelectorParameters} parameters * @returns {DOMDeferredSelector<T>} */ static use(selector, parameters) { const deferred_selector = new this(selector, parameters); deferred_selector.activate(); return deferred_selector; } /** * @protected */ activate() { if (this._is_activated || this._is_cancelled) return; this._is_activated = true; this._is_cancelled = false; delay_me_1.setImmediate(this.awaitElementProcess); } /** * Reactivates DOMDeferredSelector so it can be activated once again */ reactivate() { if (this._is_activated || !this._is_cancelled) return; this._is_activated = false; this._is_cancelled = false; if (this._interval_ref !== null) { clearInterval(this._interval_ref); this._interval_ref = null; } this._deferred = new DeferredPromise_1.DeferredPromise(); this._repeats_left = this.parameters.repeats; } /** * @returns {Promise<T | null>} */ promise() { return this._deferred.promise; } /** * Cancels deferred selection and resolves promise with null result */ cancel() { if (!this._is_activated || this._is_cancelled) return; clearInterval(this._interval_ref); this._interval_ref = null; this._is_activated = false; this._is_cancelled = true; } /** * @protected */ awaitElementProcess() { if (this._is_cancelled) { clearInterval(this._interval_ref); this._interval_ref = null; return this._deferred.resolve(null); } this._repeats_left--; const $element = this.selector.apply(null, []); if ($element !== null) { clearInterval(this._interval_ref); this._interval_ref = null; return this._deferred.resolve($element); } if (this._repeats_left === 0 || this._is_cancelled) { clearInterval(this._interval_ref); this._interval_ref = null; return this._deferred.resolve(null); } if (this._interval_ref === null && !this._is_cancelled) this._interval_ref = setInterval(this.awaitElementProcess, this.parameters.interval); } } exports.DOMDeferredSelector = DOMDeferredSelector;