Estoy tratando de usar forkJoin en dos Observables. Uno de ellos comienza como una transmisión... Si me suscribo a ellos directamente, obtengo una respuesta, forkJoin no se activa. ¿Algunas ideas?
private data$: Observable<any[]>; private statuses$: Observable<any[]>; private queryStream = new Subject<string>(); .... this.data$ = this.queryStream .startWith('') .flatMap(queryInput => { this.query = queryInput return this._companyService.getCompanies(this.queryRequired + ' ' + this.query, this.page, this.sort); }) .share(); ... Observable.forkJoin(this.statuses$, this.companies$) .subscribe(res => { console.log('forkjoin'); this._countStatus(res[0], res[1]); }); // This shows arrays in the console... this.statuses$.subscribe(res => console.log(res)); this.companies$.subscribe(res => console.log(res)); // In the console Array[9] Array[6]forkJoin emite solo cuando todos los observables internos se han completado. Si necesita un equivalente de forkJoin que solo escuche una sola emisión de cada fuente, use combineLatest + take(1)
combineLatest( this.statuses$, this.companies$, ) .pipe( take(1), ) .subscribe(([statuses, companies]) => { console.log('forkjoin'); this._countStatus(statuses, companies); }); Tan pronto como ambas fuentes emitan, combineLatest emitirá y take(1) cancelará la suscripción inmediatamente después de eso.
Un problema muy común con forkJoin es que requiere que todos los Observables de origen emitan al menos un elemento y todos deben completarse.
En otras palabras, si this.statuses$ o this.companies$ no emite ningún elemento y hasta que ambos completen, forkJoin no emitirá nada.
this.statuses$.subscribe( res => console.log(res), undefined, () => console.log('completed'), );forkJoin no funcionó, así que usé el siguiente código para resolver mi problema. Con mergeMap puede asignar el resultado de la suscripción externa a la suscripción interna y suscribirse como desee
this.statuses$.pipe( mergeMap(source => this.companies$.pipe( map(inner => [source , inner]) ) ) ).subscribe(([e , r]) => { console.log(e , r); })