Я пытаюсь перенести сложную вычислительную задачу или вызовы методов на отдельных веб-работников. Я использую 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?
Заранее большое спасибо.