diff --git a/src/vs/workbench/services/search/node/rawSearchService.ts b/src/vs/workbench/services/search/node/rawSearchService.ts index 67b74010cfa0615251da5a9fabcf9116cc2c438e..ab5eb0ffd3e98ec7ad8ac77e22bad71c0a8053f4 100644 --- a/src/vs/workbench/services/search/node/rawSearchService.ts +++ b/src/vs/workbench/services/search/node/rawSearchService.ts @@ -95,7 +95,7 @@ export class SearchService implements IRawSearchService { private doSortedSearch(engine: ISearchEngine, config: IRawSearch): PPromise<[ISerializedSearchComplete, IRawFileMatch[]], IProgress> { let searchPromise: PPromise>; - const allResultsPromise = new PPromise<[ISerializedSearchComplete, IRawFileMatch[]], IProgress>((c, e, p) => { + let allResultsPromise = new PPromise<[ISerializedSearchComplete, IRawFileMatch[]], IProgress>((c, e, p) => { let results: IRawFileMatch[] = []; searchPromise = this.doSearch(engine, -1) .then(result => { @@ -108,9 +108,7 @@ export class SearchService implements IRawSearchService { } }); }, () => { - if (!config.cacheKey) { // preserve cached promise - searchPromise.cancel(); - } + searchPromise.cancel(); }); let cache: Cache; @@ -120,6 +118,7 @@ export class SearchService implements IRawSearchService { allResultsPromise.then(null, err => { delete cache.resultsToSearchCache[config.filePattern]; }); + allResultsPromise = this.preventCancellation(allResultsPromise); } return new PPromise<[ISerializedSearchComplete, IRawFileMatch[]], IProgress>((c, e, p) => { @@ -227,7 +226,7 @@ export class SearchService implements IRawSearchService { continue; // since a path character widens the search for potential more matches, require it in previous search too } - cached = cache.resultsToSearchCache[previousSearch]; + cached = this.preventCancellation(cache.resultsToSearchCache[previousSearch]); break; } } @@ -303,6 +302,17 @@ export class SearchService implements IRawSearchService { delete this.caches[cacheKey]; return TPromise.as(undefined); } + + private preventCancellation(promise: PPromise): PPromise { + return new PPromise((c, e, p) => { + // Allow for piled up cancellations to come through first. + process.nextTick(() => { + promise.then(c, e, p); + }); + }, () => { + // Do not propagate. + }); + } } class Cache {