Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

combineLatest deprecated in favor of static combineLatest

Tags:

rxjs

rxjs6

After running the rxjs migration tool using

rxjs-5-to-6-migrate -p src/tsconfig.app.json

I'm now getting a linting error:

combineLatest is deprecated: Deprecated in favor of static combineLatest.

Here is my code before running the migration command:

this.store.combineLatest(         this.store.select(lang.getCurrent),         this.store.select(lang.getCurrentLocale)     ).subscribe(([state, currentLang, locale]) => {         this._language = session.language === currentLang ? '' : currentLang;         this._locale = session.locale === locale ? '' : locale;     }); 

My code after running the migration command: (currently presenting a linting error)

import {map, combineLatest} from 'rxjs/operators'; this.store.combineLatest(         this.store.select(lang.getCurrent),         this.store.select(lang.getCurrentLocale)     ).subscribe(([state, currentLang, locale]) => {         this._language = session.language === currentLang ? '' : currentLang;         this._locale = session.locale === locale ? '' : locale;     }); 

The question was asked in this stackoverflow questions, but it was not specific enough: Angular 6 ng lint duplicate errors and warnings, combineLatest is deprecated .

like image 270
Samer Avatar asked May 10 '18 15:05

Samer


People also ask

Does combineLatest complete?

If at least one Observable was passed to combineLatest and all passed Observables emitted something, resulting Observable will complete when all combined streams complete.

What is the difference between combineLatest and forkJoin?

forkJoin - When all observables complete, emit the last emitted value from each. combineLatest - When any observable emits a value, emit the latest value from each.

Is combineLatest synchronous?

When combineLatest subscribes to its sources, it prefetches 128 elements by default from them. This means that your first source will run to completion synchronously and the second subscription doesn't even happen until that completion.


2 Answers

In rxjs 6.5+

import { combineLatest } from 'rxjs';  combineLatest([a$, b$, c$]);  

And for most applications it's helpful to map the array of observables to a new value as well:

combineLatest([a$, b$, c$]).pipe(   map(([a$, b$, c$]) => ({     a: a$,      b: b$,      c: c$   })) ); 

Also see: https://www.learnrxjs.io/learn-rxjs/operators/combination/combinelatest

like image 123
ofir fridman Avatar answered Sep 19 '22 12:09

ofir fridman


Deprecated!

Please refer to ofir fridman's answer for the correct syntaxs as of RxJs 6.5


I found an answer in this article titled: RxJS 6: What's new and what has changed? ( which comes from official docs):

The solution is to convert:

import { combineLatest } from 'rxjs/operators';  a$.pipe(combineLatest(b$, c$)); 

into:

import { combineLatest } from 'rxjs';  combineLatest([a$, b$, c$]); 
like image 21
Samer Avatar answered Sep 22 '22 12:09

Samer