Создание Observable, которое получает свое значение из расчета подписок - PullRequest
0 голосов
/ 02 января 2019

Привет, я пытаюсь создать Observable, у которого будут значения, передаваемые ему из другой подписки, в этом случае ngrx Store Reducer .

export class IsolatedAgentService {
missionList$: Observable<any>; // I need this observables subscription to emit to calculatedValue$
calculatedValue$:Observable<any>; // I need this observable to get its values from the subscription of  missionList$ subscription
missionList:any;
constructor(
    private _store:Store<any>
){
    this.missionList$ = this._store.select(root_reducers.getMissionList).pipe(skip(1));
    this.missionList$.subscribe((val:any)=> {
        let mostIsolatedCountry:any; //will hold value of calculation
        this.missionList = val;
        mostIsolatedCountry = this.getMostIsolatedCountry(this.missionList);
        // I want tot emit mostIsolatedCountry to another subscription
    });
}

What I'mпытаюсь сделать:

export class IsolatedAgentService {
  missionList$: Observable<any>;
  calculatedValue$:Observable<any> = Observable.create((observer)=>{
    // moved this line here from the previous missionList$ subscription
    let calculated:any = this.getMostIsolatedCountry(this.missionList);
    observer.next(calculated)
  });
  missionList:any;
  calculatedValue:any;
  constructor(
    private _store:Store<any>
  ){
    this.missionList$ = this._store.select(root_reducers.getMissionList).pipe(skip(1));
    this.missionList$.subscribe((val:any)=> {
        let mostIsolatedCountry:any; 
        this.missionList = val;
        this.calculatedValue$.subscribe((value)=>{
            this.calculatedValue = value;
        });
    });
}

В настоящее время я в основном устанавливаю свойство класса в одной подписке, затем внутри этой же подписки, после установки свойства класса, я вызываю вторую подписку, которая вычисляет значениеиз этого набора свойств класса.

Это не правильно, и я уверен, что это не тот способ, но на данный момент мне не хватает моих знаний по rxjs / observable.

Внимание!Я не заинтересован в выдаче вычисленного значения через действие Store, я хочу Observable, специфичный для экземпляра класса.

1 Ответ

0 голосов
/ 25 января 2019

Вот ответ на ваш вопрос:

export class IsolatedAgentService {
  missionList$: Observable<Mission[]>;
  calculatedValue$:Observable<any>;
  constructor(
    private _store:Store<any>
  ){
    this.missionList$ = this._store.select(root_reducers.getMissionList).pipe(skip(1));
    this.calculatedValue$ = this.missionList$.pipe( 
      map( missions => this.getMostIsolatedCountry(missions) )
    );
  }
}

или даже

this.calculatedValue$ = this.missionList$.pipe(
    map( this.getMostIsolatedCountry )
);

Подробнее о фасадах NGRX: https://medium.com/@thomasburleson_11450/ngrx-facades-better-state-management-82a04b9a1e39

Почему вы не разоблачаете ииспользуя наблюдаемые, зачем даже подписываться на услугу?

Что вы должны иметь вместо

export class IsolatedAgentService {
  missionList$: Observable<Mission[]>;
  calculatedValue$:Observable<any>;
  constructor(
    private _store:Store<any>
  ){
    this.missionList$ = this._store.select(root_reducers.getMissionList).pipe(skip(1));
    this.calculatedValue$ = this._store.select(root_reducers.getMissionCalculatedValue).pipe(skip(1));
  }
}

И селектор для выполнения этого расчета вам необходим.

export const getMissionCalculatedValue= createSelector(
  getMissionList,
  (missionList) => {
    // do the calculations here
    return calculationResult;
  }
);

...