Estoy tratando de obtener Userid y serviceId después de que necesito recibir una llamada basada en el userid, el problema de serviceId aquí es que no está devolviendo el observable a ts.
Servicio.ts
function getData():observable<any>{ combineLatest([ this.activeSellService.getActiveSellServiceId(), this.authService.getUserId(), ]).subscribe(([serviceId, userId]) => { if (serviceId&& userId) { const Url = 'users/' + `${userId}` + '/services/' + `${serviceId}` + '?value=test return this.http.get<any>(this.endPoint.getUrl(encodeURI(Url))); } }) }Componente.ts:
this.service.getData().subscribe(data=>{console.log(data));Incluso no imprime los datos en la consola porque el servicio no está volviendo observable. amablemente ayúdame con este problema. de lo contrario, ¿podemos ir con diferentes soluciones en rxjs?
probar esto
function getData():observable<any>{ return combineLatest( this.activeSellService.getActiveSellServiceId(), this.authService.getUserId(), ).pipe(mergeMap([serviceId, userId]) => { if (serviceId && userId) { const Url = 'users/' + `${userId}` + '/services/' + `${serviceId}` + '?value=test return this.http.get<any>(this.endPoint.getUrl(encodeURI(Url))); } }) }nota sobre los argumentos de combinelatest y no hay suscripción en getData
por ejemplo, en stackblitz:
https://stackblitz.com/edit/angular-rxjs-combinelatest-hjyfa6?file=src/app/app.component.ts
Necesitaría usar un operador de mapeo de orden superior como switchMap para mapear de un observable a otro. Además, la función subscribe() solo acepta devoluciones de llamada y devuelve solo el objeto Subscription que contiene la suscripción.
Además, no está devolviendo nada si la condición if falla. Podría devolver un valor observable como RxJS constante EMPTY que completa inmediatamente la suscripción si la condición falla.
Es más
observable<any> debe ser Observable<any>function no es necesaria en Typescript. En su lugar, podría mencionar el identificador de alcance.combineLatest . En ese caso, podría usar forkJoin en su lugar. Sin embargo, tenga en cuenta que forkJoin solo se emite cuando se completan todas sus fuentes.Prueba lo siguiente
import { Observable, forkJoin, EMPTY } from 'rxjs'; import { switchMap } from 'rxjs/operators'; public getData(): Observable<any> { return forkJoin([ this.activeSellService.getActiveSellServiceId(), this.authService.getUserId(), ]).pipe( switchMap(([serviceId, userId]) => { if (!!serviceId && !!userId) { const Url = `users/${userId}/services/${serviceId}?value=test`; return this.http.get<any>(this.endPoint.getUrl(encodeURI(Url))); } else { return EMPTY; } }) ); }