Use different workers for get completion items and get error markers.

This commit is contained in:
yadu
2019-01-08 21:40:34 +08:00
parent 819cda6f9b
commit 3abe956573
3 changed files with 40 additions and 16 deletions
+21 -8
View File
@@ -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);
});
}
}