Samer
Samer

Reputation: 4206

combineLatest deprecated in favor of static combineLatest

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 .

Upvotes: 114

Views: 131002

Answers (6)

Owen Kelvin
Owen Kelvin

Reputation: 15083

Seems combineLatest has been deprecated and passing an array as suggested in the various answers still throws the error in rxjs v.7.0.0 Deprecation Notice

Replaced with combineLatestWith. Will be removed in v8.

For those using rxjs v.7.0.0 and above you will need to use combineLatestwith

input1Changes$.pipe(
  combineLatestWith(input2Changes$)
)

Upvotes: 9

Nevada
Nevada

Reputation: 173

import { combineLatest } from 'rxjs';

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;
});

Upvotes: 3

Samer
Samer

Reputation: 4206

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$]);

Upvotes: 113

Brijesh Lakkad
Brijesh Lakkad

Reputation: 821

combineLatest with a list of subscribers:

combineLatest([aSubscriber, bSubscriber]).pipe(map((aRes, bRes)=>{
// your business logic
}));

Upvotes: 0

ofir fridman
ofir fridman

Reputation: 2789

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

Upvotes: 143

Ayman Ftiti
Ayman Ftiti

Reputation: 87

rxjs version 6.4.0

You should import map operator from RxJs operators for it to work

combineLatest(a$, b$, c$).pipe(map([a, b, c]) => treat(a, b, c))

Upvotes: 6

Related Questions