Как вернуть Observble внутри вложенных Observables? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть две вложенные наблюдаемые, первая наблюдаемая предоставляет идентификатор, который передается в качестве аргумента второй наблюдаемой userTypeID.

Цель состоит в том, чтобы вернуть Observable на основе actionType, который может быть view или edit, чтобы сделать что-то подобное.

// returns view object 
getPresentationFields('view').subscribe(data => console.log(data)); 

// returns edit object
getPresentationFields('edit').subscribe(data => console.log(data)); 

Однако, так какЯ уже подписался на Observables в getPresentationFields(...), я не могу подписаться на саму функцию, как написано выше.

getPresentationFields(actionType: string) {
    this.customerService.getUserByID(this.id).subscribe(user => {
        this.presConfigService.getPresConfig(user.userTypeID).pipe(
            flatMap((configs) => configs),          // ----[obj1, obj2, obj3]----
            filter((configs) => configs.show)      // ----obj1----obj2----obj3----
        ).subscribe(() => {
            if(actionType == 'view'){
                // Return View Observable
            }else if(actionType == 'edit'){
                // Return Edit Observable
            }
        });
    });
}

Как я могу вернуть Observable, основываясь на параметре, переданном в getPresentationFields('view') или getPresentationFields('edit')?

1 Ответ

0 голосов
/ 27 февраля 2019

Вам не нужно подписываться в коде getPresentationFields, просто пройдите через Observable.

Грубый пример (не уверен, какую часть конфигурации вам нужно вернуть для просмотра / редактирования)

function getPresentationFields(actionType: string) {
  return this.customerService
    .getUserByID(this.id)
    .pipe(
      switchMap(user => this.presConfigService.getPresConfig(user.userTypeID)),
      flatMap((configs) => configs),
      filter((configs) => {
        if(actionType == 'view'){
          return configs.show;
        }else if(actionType == 'edit'){
          return configs.edit;
        }
      })
    )
}

ИЛИ у вас может быть if-else где-то выше:

function getPresentationFields(actionType: string) {
  const result$ = this.customerService
    .getUserByID(this.id)
    .pipe(
      switchMap(user => this.presConfigService.getPresConfig(user.userTypeID))
    );

 if(actionType == 'view'){
    return result$.pipe(
      // ... get view data
    );
  } else if(actionType == 'edit'){
    return result$.pipe(
      // ... get edit data
    )
  }
}

Как правило, подписку на Observable нужно подписывать только там, где вы получаете результаты.

itможет даже случиться, что вы на самом деле не подписываетесь в своем коде, а пропускаете наблюдаемое где-то снаружи, например, с помощью angular | async или redux effects!

Так что в основном вы будете использовать такие операторы, как switchMap , mergeMap , ОбъединитьПоследние и т. д. для обработки ваших данных и передачи их подпискам, которые станут максимально тонкими.

...