When creating NgRx effects you need to decide which RxJS operators to use. There are a lot of RxJS operators but the ones that we are going to use are: mergeMap, concatMap, exhaustMap, and switchMap. Each of these have recommended use cases in order to avoid race conditions.
Before we look at when to use each of the operators, lets look at what each of the operators does.
mergeMap: subscribe immediately, never cancel or discard
concatMap: subscribe after the last one finishes
exhaustMap: discard until the last one finishes
switchMap: cancel the last one if it has not completed
Now lets look at when to use each of the operators
mergeMap: deleting items
concatMap: updating or creating items
exhaustMap: non-parameterized queries
switchMap: parameterized queries
By following these recommendations on usage, you will avoid race conditions within your effects.