Не претендую на самый правильный подход.
Как это получилось у меня
В сервисе в нужном методе подключаешь web-worker
posts: string = 'https://jsonplaceholder.typicode.com/posts';
submit() {
if (typeof Worker !== 'undefined') {
let input$: Observable<string> = of(this.posts);
fromWorker<string, string>(
() => new Worker(new URL(`./demo.worker`, import.meta.url)),
input$
).subscribe((post) => {
console.log(`Got from worker`, post);
});
} else {
console.log('smth wrong');
}
}
Web-worker
import { DoWork, runWorker } from 'observable-webworker';
import { Observable } from 'rxjs';
import { delay, switchMap } from 'rxjs/operators';
import { ajax } from 'rxjs/ajax';
export class HelloWorker implements DoWork<any, any> {
public work(input$: Observable<any>): Observable<any> {
return this.getPosts(input$)
}
getPosts(input$: Observable<any>){
return input$.pipe(
delay(1000),
switchMap((i) => ajax.getJSON(i))
);
}
}
runWorker(HelloWorker);
Для каждой задачи я создаю новый web-worker. Но мне кажется есть возможность этого избежать.
Надеюсь это поможет