65 lines
2.1 KiB
JavaScript
65 lines
2.1 KiB
JavaScript
|
/* --------------------------------------------------------------------------------------------
|
||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||
|
* ------------------------------------------------------------------------------------------ */
|
||
|
'use strict';
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
class Delayer {
|
||
|
constructor(defaultDelay) {
|
||
|
this.defaultDelay = defaultDelay;
|
||
|
this.timeout = undefined;
|
||
|
this.completionPromise = undefined;
|
||
|
this.onSuccess = undefined;
|
||
|
this.task = undefined;
|
||
|
}
|
||
|
trigger(task, delay = this.defaultDelay) {
|
||
|
this.task = task;
|
||
|
if (delay >= 0) {
|
||
|
this.cancelTimeout();
|
||
|
}
|
||
|
if (!this.completionPromise) {
|
||
|
this.completionPromise = new Promise((resolve) => {
|
||
|
this.onSuccess = resolve;
|
||
|
}).then(() => {
|
||
|
this.completionPromise = undefined;
|
||
|
this.onSuccess = undefined;
|
||
|
var result = this.task();
|
||
|
this.task = undefined;
|
||
|
return result;
|
||
|
});
|
||
|
}
|
||
|
if (delay >= 0 || this.timeout === void 0) {
|
||
|
this.timeout = setTimeout(() => {
|
||
|
this.timeout = undefined;
|
||
|
this.onSuccess(undefined);
|
||
|
}, delay >= 0 ? delay : this.defaultDelay);
|
||
|
}
|
||
|
return this.completionPromise;
|
||
|
}
|
||
|
forceDelivery() {
|
||
|
if (!this.completionPromise) {
|
||
|
return undefined;
|
||
|
}
|
||
|
this.cancelTimeout();
|
||
|
let result = this.task();
|
||
|
this.completionPromise = undefined;
|
||
|
this.onSuccess = undefined;
|
||
|
this.task = undefined;
|
||
|
return result;
|
||
|
}
|
||
|
isTriggered() {
|
||
|
return this.timeout !== void 0;
|
||
|
}
|
||
|
cancel() {
|
||
|
this.cancelTimeout();
|
||
|
this.completionPromise = undefined;
|
||
|
}
|
||
|
cancelTimeout() {
|
||
|
if (this.timeout !== void 0) {
|
||
|
clearTimeout(this.timeout);
|
||
|
this.timeout = undefined;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
exports.Delayer = Delayer;
|