mono/packages/core/dist/observableInternal/utilsCancellation.js
2025-01-28 13:42:22 +01:00

83 lines
3.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.
*--------------------------------------------------------------------------------------------*/
import { DebugNameData } from './debugName.js';
import { CancellationError, CancellationTokenSource } from './commonFacade/cancellation.js';
import { Derived } from './derived.js';
import { strictEquals } from './commonFacade/deps.js';
import { autorun } from './autorun.js';
export function waitForState(observable, predicate, isError, cancellationToken) {
if (!predicate) {
predicate = state => state !== null && state !== undefined;
}
return new Promise((resolve, reject) => {
let isImmediateRun = true;
let shouldDispose = false;
const stateObs = observable.map(state => {
/** @description waitForState.state */
return {
isFinished: predicate(state),
error: isError ? isError(state) : false,
state
};
});
const d = autorun(reader => {
/** @description waitForState */
const { isFinished, error, state } = stateObs.read(reader);
if (isFinished || error) {
if (isImmediateRun) {
// The variable `d` is not initialized yet
shouldDispose = true;
}
else {
d.dispose();
}
if (error) {
reject(error === true ? state : error);
}
else {
resolve(state);
}
}
});
if (cancellationToken) {
const dc = cancellationToken.onCancellationRequested(() => {
d.dispose();
dc.dispose();
reject(new CancellationError());
});
if (cancellationToken.isCancellationRequested) {
d.dispose();
dc.dispose();
reject(new CancellationError());
return;
}
}
isImmediateRun = false;
if (shouldDispose) {
d.dispose();
}
});
}
export function derivedWithCancellationToken(computeFnOrOwner, computeFnOrUndefined) {
let computeFn;
let owner;
if (computeFnOrUndefined === undefined) {
computeFn = computeFnOrOwner;
owner = undefined;
}
else {
owner = computeFnOrOwner;
computeFn = computeFnOrUndefined;
}
let cancellationTokenSource = undefined;
return new Derived(new DebugNameData(owner, undefined, computeFn), r => {
if (cancellationTokenSource) {
cancellationTokenSource.dispose(true);
}
cancellationTokenSource = new CancellationTokenSource();
return computeFn(r, cancellationTokenSource.token);
}, undefined, undefined, () => cancellationTokenSource?.dispose(), strictEquals);
}
//# sourceMappingURL=utilsCancellation.js.map