83 lines
3.1 KiB
JavaScript
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
|