Как веб-работник вызывает методы, определенные в классе Typescript? - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь перенести сложную вычислительную задачу или вызовы методов на отдельных веб-работников. Я использую URL.createObjectURL (blob) для ввода рабочего кода. Но из кода он должен вызывать некоторые другие функции, которые определены в Typescript (сложно поместить всю сложную логику в большой двоичный объект работника).

let workers = {};

export function mapWorker<T, R>(cb: (value: T) => R, input: any): Observable<R>
{
    const subject = new Subject<R>();
    let workerString = cb.toString();
    let worker: Worker;

    if (workers[workerString])
    {
        worker = workers[workerString];
    } else{
        worker = createStaticWorker(cb);
        workers[workerString] = worker;
    }

    worker.onmessage = e => subject.next(e.data);
    worker.onerror = err => subject.error(err);
    worker.postMessage(input);
    return subject;
}

export function createStaticWorker(fn: Function): Worker
{
    const blob = new Blob(
        [ 'self.cb = ', fn.toString(), ';',
          'self.onmessage = function (e) { self.postMessage(self.cb(e.data)) }'
        ], {
            type: 'text/javascript'
        }
    );
    const url = URL.createObjectURL(blob);
    return new Worker(url);
}

При использовании я сделал это.

    mapWorker(x =>
    {
        return Helper.AsyncCalc(x as Array<any>);
    }, inputs).subscribe(value => this.areas = value);

Тогда Helper.AsyncCalc был методом, определенным в Helper.ts, который содержит большую часть логики. Я заметил, что во время выполнения имя помощника было скомпилировано с другим именем в JS, что привело к ошибке, говорящей, что это не определено. Может ли кто-нибудь помочь в этом? Есть ли способ вызвать метод Typescript из этого встроенного метода js?

Заранее большое спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...