En mi proyecto para aprender Angular. Ejecuté una función que devuelve múltiples valores usando RxJS.
El problema es que descubrí que usar varios suscriptores se reduce a Subscribe hell...
Probé con SwitchMap, funcionó para el primer valor devuelto, pero tengo que usar ese último valor devuelto para devolver otros valores. el problema es que me devuelve un valor indefinido. Creo que hice mal uso de switchMap...
(Pondré las 2 versiones de mi función):
Método de trabajo pero con múltiples Suscripciones:
addToCart2() { const { quantity } = this.productForm.value; const sessionCart = sessionStorage.getItem('cart_Session'); // Get Cart ID from SessionStorage this.cartService .retrieveCart(sessionCart!) .subscribe(({ id: cart_ID }: Cart) => { console.log('ID Cart : ', cart_ID); console.log('Cart Already init'); // Add to cart method this.cartService .addToCart(cart_ID, this.product_ID, quantity, this.variant_Data) .subscribe( () => { // Get current cart items to send Total items to Header this.cartService.retrieveCart(cart_ID).subscribe((items) => { this.cart_Items = items.line_items; this.total_Items = items.total_unique_items; this.cartService._totalItems$.next(this.total_Items); }); // Modal Success TODO !! }, (err) => { console.log('Error in Request !!!', err); }, () => { console.log('Add to Cart Finish.'); } ); }); }Usando SwitchMap pero no funciona completamente:
addToCart__NotWorking() { // Test const { quantity } = this.productForm.value; const sessionCart = sessionStorage.getItem('cart_Session'); this.cartService .retrieveCart(sessionCart!) .pipe( switchMap(({ id: cart_ID }) => { console.log('SwitchMap', cart_ID); return this.cartService.addToCart( cart_ID, this.product_ID, quantity, this.variant_Data ); }), switchMap(({ id: cart_ID }) => { return this.cartService.retrieveCart(cart_ID); }) ) .subscribe((values) => { console.log('SwitchMap Final True : ', values); });}
Sí, parece que está perdiendo cart_id entre switchMaps, return this.cartService.addToCart no devuelve la identificación, al menos de acuerdo con sus suscripciones anidadas, en su lugar, usa la misma identificación de carrito que pasa a addToCart . Lo que puede hacer es usar mapTo ya que no parece necesitar la respuesta devuelta por this.cartService.addToCart . Entonces, podrías hacer:
switchMap(({ id: cart_ID }) => { console.log('SwitchMap', cart_ID); return this.cartService.addToCart( cart_ID, this.product_ID, quantity, this.variant_Data ).pipe( mapTo({ id: cart_ID }) // here, now it returns the id! ); }), // .....