Cancelling an Observable mid-chain when a condition is not met

Viewed 534

Is it possible to cancel an Observable in mid-chain? Suppose we have some chain of events that depend on each other and if one chain fails, there's no need to continue.

observable_1.pipe(
  take(1),
  switchMap((result_1) => {
    // Do something that requires observable_1 and return something
    // If it fails, there is no point to proceed
    // If it succeeds, we can continue
  }),
  switchMap((result_2) => {
    // Do something that requires result_2 and return something
    // If it fails, there is no point to proceed
    // If it succeeds, we can continue
  }),
  // etc...
);
2 Answers

So you can use the filter operator for this purpose:

observable_1.pipe(
      take(1),
      switchMap((result_1) => {
      }),
      switchMap((result_2) => {
        // If it fails, there is no point to proceed
        result_2.status = false;
        // If it succeeds, we can continue
        result_2.status = true;
        return result_2;
      }),
      filter(result => result.status)
      // etc...
    );

Looks like you need EMPTY.

observable_1.pipe(
  take(1),
  switchMap((result_1) => {
    // doing something
    if (successful) {
      return of(result_2);
    }
    return EMPTY; // no further emits.
  }),
  // we are here only in cases of result_2. EMPTY won't trigger it.
  switchMap((result_2) => {
    // doing something
    if (successful) {
      return of(result_3);
    }
    return EMPTY; // no further emits.
  }),
  // we are here only in cases of result_3. EMPTY won't trigger it.
);
Related