dom-observe
Version:
  • 3.42 kB
JavaScript
"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;