Home Angular Tutorials How to use the forkJoin operator in angular ?

How to use the forkJoin operator in angular ?

by aouidane.med.amine
186,991 views 5 min read

Asynchronous programming can be a difficult task, but RxJS makes it easy with its powerful operators. One of the most useful operators in RxJS is the forkJoin operator.

ForkJoin allows you to run multiple asynchronous operations in parallel and wait for them all to complete before emitting a value.

This makes it an essential tool for handling complex asynchronous operations in your applications.

In this tutorial, we’ll dive into the forkJoin operator in RxJS and explore some tips, tricks and best practices for using it effectively.

Whether you’re a beginner or experienced developer, this guide will help you master the forkJoin operator and take your RxJS skills to the next level.

Table of Contents

How to use the forkJoin Operator ?

The syntax of the forkJoin operator is very simple. It takes an array of observers as arguments and returns an observer that issues an array of the last values from each input observer.

				
					forkJoin(...obs: any[]): Observable<any[]>

				
			

Here, ...obs is a spread operator that allows us to pass any number of observables to the forkJoin operator.

Example :

Let’s take a look at this example to see how the forkJoin operator works in practice.

				
					const observable1$ = of(1, 2, 3);
const observable2$ = of('a', 'b', 'c');
const observable3$ = of(true, false);

forkJoin(observable1$, observable2$, observable3$).subscribe({
  next: ([result1, result2, result3]) => {
    console.log(`Result 1: ${result1}`);
    console.log(`Result 2: ${result2}`);
    console.log(`Result 3: ${result3}`);
  },
  error: err => console.error(err),
  complete: () => console.log('Complete')
});

				
			

In this example, we have three observables: observable1$observable2$, and observable3$. We pass all three observables to the forkJoin operator, and subscribe to the resulting observable.

Now, let’s check the console logs : 

How to use forkJoin operator in angular

When all three observables complete, the forkJoin operator will emit an array of their last emitted values to the next callback of the subscribe method.

In this case, we restructure the emitted array into three variables: result1, result2, and result3, and log their values to the console.

Tips for Using the forkJoin Operator

Now that we have a good understanding of what the forkJoin operator is and how it works, let’s explore some tips and best practices for using it effectively.

Use it with caution when dealing with large streams

One of the main advantages of the forkJoin operator is that it waits for all observables to complete before issuing results.

However, because the operator waits for all observables to complete before publishing results, performance issues can arise when processing large streams.

To avoid the performance problems, it is recommended to use the forkJoin operator with smaller streams or in combination with other operators such as take() or filter() to limit emissions.

				
					import { forkJoin, interval } from 'rxjs';
import { filter, take } from 'rxjs/operators';

const source1$ = interval(1000).pipe(
  take(5) // Emits the first 5 values and then completes
);

const source2$ = interval(500).pipe(
  filter(val => val % 2 === 0), // Emits only even numbers
  take(4) // Emits the first 4 even numbers and then completes
);

forkJoin({
  source1: source1$,
  source2: source2$
}).subscribe({
  next: (result) => console.log(result),
  complete: () => console.log('Complete!')
});

// Output:
// { source1: 4, source2: 6 }
// Complete!

				
			

In this example, we’re creating two observables  source1$ and source2$ and we used take() and filter() operators to limit the emissions and avoid performance issues.

source1$ emits a value every second for a total of 5 emissions and then completes.

source2$ emits a value every 500ms but only emits even numbers. It emits a total of 4 even numbers and then completes.

Avoid using it with infinite observables

The forkJoin operator is not designed to process infinite observers, as it waits for all observers to complete before emitting a result.

If one of the observables in the stream is infinite, the forkJoin operator will never emit a result.

To work around this problem, it is recommended instead to use the combineLatest operator, which emits a new value each time one of the observables emits a value.

Use it for Independent Observables

forkJoin operator is best suited for independent observables that do not depend on each other.

If you have a set of observables that are dependent on each other, it is recommended to use other operators like combineLatest or zip.

Error Handling

Always make sure to handle errors properly while using forkJoin.

If any of the observables inside the forkJoin fails, the whole operation will fail, so it is important to handle errors properly.

Use it only when necessary

forkJoin should only be used when you need to combine multiple observables and get a final result after all of them have completed.

If you just need to combine two observables, zip operator is a better choice.

Best Practices for Debugging ForkJoin

Debugging code can be a challenging task, and ForkJoin is not an exception.

In this section, we’ll discuss some best practices for identifying and fixing issues when working with ForkJoin operator.

Logging Observable Streams

One of the most used techniques for debugging ForkJoin operator is to log your observable streams to the console.

By logging the emissions of each observable, you can get a better understanding of how they are working and identify any issues that may be occurring.

Using the tap() Operator

The tap() operator is another powerful tool for debugging your observable streams.

With tap(), you can inspect the data within your observables and see how they are being transformed as they are processed without doing any modifications.

				
					
forkJoin({obs1,obs2,obs_n ...})
.pipe(tap(console.log))
.subscribe();

				
			

Conclusion

In conclusion, the ForkJoin operator in RxJS is a powerful tool for combining multiple streams and emitting their values as a single observable.

However, it is important to use it carefully and with consideration of the potential performance issues that can arise.

By following the best practices such as limiting emissions with the take() and filter() operators, and using debugging techniques like console logging and the tap() operator, you can effectively use ForkJoin operator to simplify your code.

References and Links

You may also like