Neue Version
Auf der Basis der Lösung, die Sie here finden können, habe ich eine einfache Klasse bauen, die eine WebWorker nutzen, um seine Aufgaben zu erledigen.
Sie brauchen 3 Dateien, um einen funktionierenden Worker zu haben.
Datei-loader.d.ts - Notwendigkeit WebWorker Dateien
declare module "file-loader?name=[name].js!*" {
const value: string;
export = value;
}
Hintergrund-worker.ts laden - Klasse avaliable in Ihrer Anwendung
import * as workerPath from "file-loader?name=[name].js!./web-worker-example";
class BackgroundWorker {
constructor() {
let worker = new Worker(workerPath);
worker.onmessage = this.handleMessage;
worker.postMessage('Caller: Help Me for background Work');
// Message content can contain only Javascript Objects
//
// For Documentation:
// https://developer.mozilla.org/en-US/docs/Web/API/Worker/postMessage
//
}
private handleMessage(this: Worker, message: MessageEvent) {
console.log(message.data);
switch(message.data) {
case 'Worker: Working':
// ... Something To Do ...
break;
case 'Worker: Ok, I will Do It':
// ... Something To Do ...
break;
case 'Worker: No, I can not':
// ... Something To Do ...
break;
case 'Worker: Done':
this.terminate();
break;
}
}
}
web-worker-beispiel.ts
// ****************************************************************** Worker Bridge
// self is a keyword: Reference to this Worker
self.onmessage = bridge;
function bridge(message: MessageEvent) {
HandleWork(message.data);
CallBack('Done');
// use:
// self.close();
// if you need to terminate worker from Worker Environment.
}
function CallBack(message: string) {
self.postMessage('Worker: ' + message, undefined);
}
// ****************************************************************** Worker Body
function HandleWork(workTask: string) {
if(workTask == 'Caller: Help Me for background Work') {
CallBack('Ok, I will Do It');
DoVeryComplexWork();
return;
}
CallBack('No, I can not');
}
function DoVeryComplexWork() {
// ... Something To Do ...
// Example:
for(let i: number = 0; i < 1000000000; i++) {
if(i % 100000000 == 0) {
CallBack('Working');
}
}
}
Arbeiter zu starten, instanziiert nur Arbeiter new BackgroundWorker()
und einen Blick auf die Konsole nehmen.
alte Version
Ich hatte Ihr gleiches Problem und löste es durch einen Dienst aufzubauen, die eine Klasse von WebWorker erstreckt. In der Praxis funktioniert der Service, indem an den WebWorker zwei Dinge, Daten und eine Funktion übergeben werden, die die Daten ausarbeiten.
Ich postete ein Beispiel auf GitHub. Die gesamte erforderliche Logik befindet sich in den folgenden zwei Dateien.
fibonacci-worker.service.ts
worker.ts
Werfen Sie einen Blick auf app.component.ts für Call-Methoden.
Grüße.
Ich habe dein Problem. Die Beispiele im Internet sind verwirrend und Beta-Versionen von eckigen (vor der Implementierung von ngModule) – batressc
Ich fand dieses einfache Beispiel https://github.com/thelgevold/angular-2-samples/tree/master/components/web-workers welche verwendet ngModule. –