Use different workers for get completion items and get error markers.
This commit is contained in:
@@ -9,8 +9,9 @@ export enum ParseReason {
|
||||
export class LanguageServiceFacade {
|
||||
private static readonly timeout : number = 2000;
|
||||
|
||||
private static workingWorker : Worker = null;
|
||||
|
||||
private static workingWorkerForCompletion : Worker = null;
|
||||
private static workingWorkerForGettingError : Worker = null;
|
||||
|
||||
public static GetLanguageServiceParseResult(str : string, parseReason : ParseReason) : Q.Promise<any> {
|
||||
const timeExceeded = Q.Promise<any>((resolve : any, reject : any) => {
|
||||
const wait = setTimeout(() => {
|
||||
@@ -20,23 +21,35 @@ export class LanguageServiceFacade {
|
||||
});
|
||||
|
||||
const result = LanguageServiceFacade.GetParseResult(str, parseReason);
|
||||
let workingWorker = (parseReason === ParseReason.GetCompletionWords ? LanguageServiceFacade.workingWorkerForCompletion : LanguageServiceFacade.workingWorkerForGettingError);
|
||||
return Q.race([timeExceeded, result]).then(function(words) {
|
||||
LanguageServiceFacade.workingWorker.terminate();
|
||||
workingWorker.terminate();
|
||||
return words;
|
||||
});
|
||||
}
|
||||
|
||||
private static GetParseResult = (str : string, parseReason : ParseReason) : Q.Promise<any> => {
|
||||
return Q.Promise((resolve : any) => {
|
||||
if (LanguageServiceFacade.workingWorker != null) {
|
||||
LanguageServiceFacade.workingWorker.terminate();
|
||||
|
||||
let workingWorker = (parseReason === ParseReason.GetCompletionWords ? LanguageServiceFacade.workingWorkerForCompletion : LanguageServiceFacade.workingWorkerForGettingError);
|
||||
|
||||
// terminate the expired worker.
|
||||
if (workingWorker != null) {
|
||||
workingWorker.terminate();
|
||||
}
|
||||
|
||||
const currentUrlWithoutQueryParamsAndHashRoute: string = `${window.location.protocol}//${window.location.host}${window.location.pathname}`;
|
||||
let url = currentUrlWithoutQueryParamsAndHashRoute.replace(/\/[^\/]*$/, '/node_modules/@azure/cosmos-language-service/dist/worker/dist/LanguageServiceWorker.js');
|
||||
LanguageServiceFacade.workingWorker = new Worker(url);
|
||||
|
||||
if(parseReason === ParseReason.GetCompletionWords) {
|
||||
LanguageServiceFacade.workingWorkerForCompletion = new Worker(url);
|
||||
workingWorker = LanguageServiceFacade.workingWorkerForCompletion;
|
||||
} else {
|
||||
LanguageServiceFacade.workingWorkerForGettingError = new Worker(url);
|
||||
workingWorker = LanguageServiceFacade.workingWorkerForGettingError;
|
||||
}
|
||||
|
||||
LanguageServiceFacade.workingWorker.onmessage = (ev : MessageEvent) => {
|
||||
workingWorker.onmessage = (ev : MessageEvent) => {
|
||||
var processedResults: any[] = [];
|
||||
var parseResults: any[] = ev.data;
|
||||
|
||||
@@ -72,7 +85,7 @@ export class LanguageServiceFacade {
|
||||
code : str,
|
||||
reason : parseReason
|
||||
};
|
||||
LanguageServiceFacade.workingWorker.postMessage(source);
|
||||
workingWorker.postMessage(source);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user