@@ -32,7 +32,7 @@ interface IAsyncDataTreeNode<TInput, T> {
32
32
readonly parent : IAsyncDataTreeNode < TInput , T > | null ;
33
33
readonly children : IAsyncDataTreeNode < TInput , T > [ ] ;
34
34
readonly id ?: string | null ;
35
- refreshPromise : Promise < void > | undefined ;
35
+ refreshPromise : CancelablePromise < void > | undefined ;
36
36
hasChildren : boolean ;
37
37
stale : boolean ;
38
38
slow : boolean ;
@@ -528,7 +528,7 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
528
528
private readonly findController ?: AsyncFindController < TInput , T , TFilterData > ;
529
529
private readonly getDefaultCollapseState : { ( e : T ) : undefined | ObjectTreeElementCollapseState . PreserveOrCollapsed | ObjectTreeElementCollapseState . PreserveOrExpanded } ;
530
530
531
- private readonly subTreeRefreshPromises = new Map < IAsyncDataTreeNode < TInput , T > , Promise < void > > ( ) ;
531
+ private readonly subTreeRefreshPromises = new Map < IAsyncDataTreeNode < TInput , T > , CancelablePromise < void > > ( ) ;
532
532
private readonly refreshPromises = new Map < IAsyncDataTreeNode < TInput , T > , CancelablePromise < Iterable < T > > > ( ) ;
533
533
534
534
protected readonly identityProvider ?: IIdentityProvider < T > ;
@@ -769,8 +769,7 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
769
769
}
770
770
771
771
async setInput ( input : TInput , viewState ?: IAsyncDataTreeViewState ) : Promise < void > {
772
- this . refreshPromises . forEach ( promise => promise . cancel ( ) ) ;
773
- this . refreshPromises . clear ( ) ;
772
+ this . cancelAllRefreshPromises ( ) ;
774
773
775
774
this . root . element = input ! ;
776
775
@@ -792,6 +791,14 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
792
791
await this . _updateChildren ( element , recursive , rerender , undefined , options ) ;
793
792
}
794
793
794
+ cancelAllRefreshPromises ( ) : void {
795
+ this . refreshPromises . forEach ( promise => promise . cancel ( ) ) ;
796
+ this . refreshPromises . clear ( ) ;
797
+
798
+ this . subTreeRefreshPromises . forEach ( promise => promise . cancel ( ) ) ;
799
+ this . subTreeRefreshPromises . clear ( ) ;
800
+ }
801
+
795
802
private async _updateChildren ( element : TInput | T = this . root . element , recursive = true , rerender = false , viewStateContext ?: IAsyncDataTreeViewStateContext < TInput , T > , options ?: IAsyncDataTreeUpdateChildrenOptions < T > ) : Promise < void > {
796
803
if ( typeof this . root . element === 'undefined' ) {
797
804
throw new TreeError ( this . user , 'Tree input not set' ) ;
@@ -875,7 +882,7 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
875
882
}
876
883
877
884
if ( node . refreshPromise ) {
878
- await this . root . refreshPromise ;
885
+ await node . refreshPromise ;
879
886
await Event . toPromise ( this . _onDidRender . event ) ;
880
887
}
881
888
@@ -886,7 +893,7 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
886
893
const result = this . tree . expand ( node === this . root ? null : node , recursive ) ;
887
894
888
895
if ( node . refreshPromise ) {
889
- await this . root . refreshPromise ;
896
+ await node . refreshPromise ;
890
897
await Event . toPromise ( this . _onDidRender . event ) ;
891
898
}
892
899
@@ -1088,28 +1095,26 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
1088
1095
return ;
1089
1096
}
1090
1097
}
1091
-
1092
1098
return this . doRefreshSubTree ( node , recursive , viewStateContext ) ;
1093
1099
}
1094
1100
1095
1101
private async doRefreshSubTree ( node : IAsyncDataTreeNode < TInput , T > , recursive : boolean , viewStateContext ?: IAsyncDataTreeViewStateContext < TInput , T > ) : Promise < void > {
1096
- let done : ( ) => void ;
1097
- node . refreshPromise = new Promise ( c => done = c ) ;
1098
- this . subTreeRefreshPromises . set ( node , node . refreshPromise ) ;
1102
+ const cancelablePromise = createCancelablePromise ( async ( ) => {
1103
+ const childrenToRefresh = await this . doRefreshNode ( node , recursive , viewStateContext ) ;
1104
+ node . stale = false ;
1099
1105
1100
- node . refreshPromise . finally ( ( ) => {
1106
+ await Promises . settled ( childrenToRefresh . map ( child => this . doRefreshSubTree ( child , recursive , viewStateContext ) ) ) ;
1107
+ } ) ;
1108
+
1109
+ node . refreshPromise = cancelablePromise ;
1110
+ this . subTreeRefreshPromises . set ( node , cancelablePromise ) ;
1111
+
1112
+ cancelablePromise . finally ( ( ) => {
1101
1113
node . refreshPromise = undefined ;
1102
1114
this . subTreeRefreshPromises . delete ( node ) ;
1103
1115
} ) ;
1104
1116
1105
- try {
1106
- const childrenToRefresh = await this . doRefreshNode ( node , recursive , viewStateContext ) ;
1107
- node . stale = false ;
1108
-
1109
- await Promises . settled ( childrenToRefresh . map ( child => this . doRefreshSubTree ( child , recursive , viewStateContext ) ) ) ;
1110
- } finally {
1111
- done ! ( ) ;
1112
- }
1117
+ return cancelablePromise ;
1113
1118
}
1114
1119
1115
1120
private async doRefreshNode ( node : IAsyncDataTreeNode < TInput , T > , recursive : boolean , viewStateContext ?: IAsyncDataTreeViewStateContext < TInput , T > ) : Promise < IAsyncDataTreeNode < TInput , T > [ ] > {
0 commit comments