Home > front end >  Get previous observable result to fork join pipe RXJS
Get previous observable result to fork join pipe RXJS

Time:04-22

First Http call to fetch Shipment Data IF shipment data is NOT AVAILABLE exceution will be stop with showing error

IF shipment data is AVAILABLE i need to call second and third calls paralalley

I used fork join to call paralell request and after fetching fork join data how to use shipment data inside in the fork join map method.

   from(getShipment(this.data.CardId))
              .pipe(
                filter(shipmentData => shipmentData != undefined),
                tap(shipmentData => {
                  if (shipmentData.ShipmentId === null || shipmentData.ShipmentId === "") {
                    throw "Shipment needs to be connected"
                  }
                }),
                //I NEED TO PASS THIS SHIPMENT DATA TO FORK JOIN PIPE METHOD
                map(shipmentData => shipmentData),                
                concatMap(shipmentData =>
                  forkJoin([
                    getOrderLineAllocationByCardIdObservable(this.data.CardId),
                    getLotsByCardIdObservable(this.data.CardId)
                  ])
                    .pipe(
                      filter(response => response != undefined),
                      map(([inventoryData, lotsData],shipmentData) => {
                                               
                       //I NEED TO ACCESS SHIPMENT DATA IN HERE
                       //SHIPMENT DATA NOT AVAILABLE IN HERE
        
                      })
                    )
                ),
                // Catch errors thrown above
                catchError(error => {                      
                  return EMPTY;
                }),
                // Always finish by Hiding Loading indicator
                finalize(() => this.store.dispatch(setLoadingSpinner({showLoading: false})))
              )
              .subscribe();

CodePudding user response:

Just remove shipmentData as argument from your map function, its already there:

import {
  of,
  map,
  Observable,
  from,
  filter,
  tap,
  concatMap,
  forkJoin,
  catchError,
  finalize,
} from 'rxjs';

// Open the console in the bottom right to see results.
function getShipment(x) {
  return new Promise(function (res, rej) {
    res({ key: 'hi, im shipmentData', ShipmentId: 989 });
  });
}

function getOrderLineAllocationByCardIdObservable(x) {
  return of(1);
}

function getLotsByCardIdObservable(x) {
  return of(2);
}

from(getShipment(1))
  .pipe(
    filter((shipmentData) => shipmentData != undefined),
    tap((shipmentData: any) => {
      if (shipmentData.ShipmentId === null || shipmentData.ShipmentId === '') {
        throw 'Shipment needs to be connected';
      }
    }),
    concatMap((shipmentData) =>
      forkJoin(
        getOrderLineAllocationByCardIdObservable(666),
        getLotsByCardIdObservable(666)
      ).pipe(
        filter((response) => response != undefined),
        map(([inventoryData, lotsData]) => {
          console.log(shipmentData);
        })
      )
    ),
    // Catch errors thrown above
    catchError((error) => {
      return of();
    }),
    // Always finish by Hiding Loading indicator
    finalize(() =>
      // this.store.dispatch(setLoadingSpinner({ showLoading: false }))
      console.log('rdy')
    )
  )
  .subscribe();

runnable example: https://stackblitz.com/edit/rxjs-t5mzxy?file=index.ts

  • Related