MattTreichel
MattTreichel

Reputation: 1563

Asynchronous equivalent to tap() in RxJS?

I have a side effect Observable that's required to be resolved before the main Observable is completed. If it were a synchronous operation, I could use the tap() operator. Is there a clear equivalent for an asynchronous operation?

In the following example, I have to map the inner value back to the outer value I actually want to pipe through. How would I avoid this mapping?

  const user = requestUser().pipe( 
    switchMap(user => {
      return requestAndAssignToken(user)
        .pipe(
          map(token => user)
        );
    })
  );

Upvotes: 18

Views: 10991

Answers (1)

ggradnig
ggradnig

Reputation: 14159

If I understand correctly, you want to ignore the result of the inner Observable and just have the outer Observable wait for it to emit before moving on.

In that case, I'd suggest the delayWhen operator. It is passed a delayDurationSelector that returns an Observable (the duration Observable). It then behaves like stated in the documentation:

The source value is emitted on the output Observable only when the duration Observable emits a value or completes

For your example, it would look like this:

const user = requestUser().pipe( 
    delayWhen(user => requestAndAssignToken(user))
);

Here is a simple example

Upvotes: 22

Related Questions