1
- import { Pipe , PipeTransform } from '@angular/core' ;
1
+ import { OnDestroy , Pipe , PipeTransform } from '@angular/core' ;
2
2
import { Observable } from 'rxjs' ;
3
3
import { WebWorker } from '../classes/web-worker' ;
4
4
import { toData } from '../operators/to-data' ;
@@ -7,21 +7,35 @@ import {WorkerFunction} from '../types/worker-function';
7
7
@Pipe ( {
8
8
name : 'waWorker' ,
9
9
} )
10
- export class WorkerPipe implements PipeTransform {
11
- private workers = new WeakMap < WorkerFunction , WebWorker > ( ) ;
12
- private observers = new WeakMap < WebWorker , Observable < any > > ( ) ;
10
+ export class WorkerPipe implements PipeTransform , OnDestroy {
11
+ private fn ! : WorkerFunction ;
12
+ private worker ! : WebWorker ;
13
+ private observer ! : Observable < any > ;
13
14
14
15
transform < T , R > ( value : T , fn : WorkerFunction < T , R > ) : Observable < R > {
15
- const worker : WebWorker < T , R > =
16
- this . workers . get ( fn ) || WebWorker . fromFunction ( fn ) ;
16
+ if ( this . fn !== fn ) {
17
+ this . terminateWorker ( ) ;
18
+ this . initNewWorker ( fn ) ;
19
+ }
17
20
18
- this . workers . set ( fn , worker ) ;
19
- worker . postMessage ( value ) ;
21
+ this . worker . postMessage ( value ) ;
20
22
21
- const observer = this . observers . get ( worker ) || worker . pipe ( toData ( ) ) ;
23
+ return this . observer ;
24
+ }
25
+
26
+ ngOnDestroy ( ) : void {
27
+ this . terminateWorker ( ) ;
28
+ }
22
29
23
- this . observers . set ( worker , observer ) ;
30
+ private terminateWorker ( ) {
31
+ if ( this . worker ) {
32
+ this . worker . terminate ( ) ;
33
+ }
34
+ }
24
35
25
- return observer ;
36
+ private initNewWorker < T , R > ( fn : WorkerFunction < T , R > ) {
37
+ this . fn = fn ;
38
+ this . worker = WebWorker . fromFunction ( fn ) ;
39
+ this . observer = this . worker . pipe ( toData ( ) ) ;
26
40
}
27
41
}
0 commit comments