Реализация switchMap в порядке звонков - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу выполнить остальные запросы по порядку, используя switchMap (...) из RxJs.

Объект:

export class Transaction {
  constructor(
    public id: string,
    public unique_id: string,
    public name: string,
    public status: string,
    public type: string,
    public created_at: Date
  ) {}
}

Компонент:

@Component({
  selector: 'app-transaction-details',
  templateUrl: './transaction-details.component.html',
  styleUrls: ['./transaction-details.component.scss']
})
export class TransactionDetailsComponent implements OnInit {

  processingLogs: ProcessingLogs = new ProcessingLogs(null, null, null, null, null);
  transaction: Transaction;

  constructor(private transactionService: TransactionService,
              private processingLogsService: ProcessingLogsService,
              private route: ActivatedRoute) { }

  ngOnInit() {
    this.route.params.pipe(
      flatMap(params => {
        if(params['id']) {
          return this.transactionService.get(params['id']);
        } else {
          return of(null);
        }
      })
    ).subscribe(value => {
      if(value != null) {
        this.transaction = value;
      }
    });

    this.route.params.pipe(
      flatMap(params => {
        if (transaction.unique_id) {
          return this.processingLogsService.getProcessingLogsList(transaction.unique_id);
        } else {
          return of(null);
        }
      })
    ).subscribe(value => {
      if (value != null) {
        this.processingLogs = value;
      }
    });
  }
}

Я пробовал это:

this.route.params.pipe(
  tap( params => {
        if(params['id']) {
          return this.transactionService.get(params['id']);
        } else {
          return of(null);
        }
      }),
      switchMap( value => this.processingLogsService.getProcessingLogsList(value.unique_id) )
  )

Сначала я хотел бы загрузить transactionService.get(params['id']) используя id по ссылке http.Во-вторых, когда загружен объект Transaction, я бы хотел загрузить getProcessingLogsList(transaction.unique_id), используя unique_id, загруженный из первого запроса.Я получаю несколько ошибок с моей попыткой кода.Я получаю пустой результат при запуске кода.

РЕДАКТИРОВАТЬ: Я проверял это, но данные на странице пустые:

const transactionService = (x) => of(`transaction ${x}`);
    const processLog = (x) => of(`logged ${x}`);

    this.route.params.pipe(
      switchMap(x=> transactionService(x).pipe(
        switchMap(x=>processLog(x))
      ))
    ).subscribe(x=>console.log(x));

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Следуя ответу @ dK-, вы можете связать switchMap, но не пробовали ли вы безымянный способ?

routeparams.pipe(
    switchMap(x=> transactionService),
    switchMap(x=>processLog)
).subscribe(x=>console.log(x));

посмотрите здесь -> https://rxviz.com/v/EOe2L9ZJ

EDITED

хорошо, вы можете попробовать это?это то же самое, но я повторно использовал ваши оригинальные методы

ngOnInit() {
  this.route.params.pipe(
    map(params=>params['id']),
    switchMap(idParameter=> this.processingLogsService.getProcessingLogsList)
  ).subscribe(logList=>
      console.log(logList)
  );
}
0 голосов
/ 30 ноября 2018

Я считаю, что вам нужно это цепочка switchMap.Как то так:

const routeparams = of('1');
const transactionService = (x) => of(`transaction ${x}`);
const processLog = (x) => of(`logged ${x}`);

routeparams.pipe(
  switchMap(x=> transactionService(x).pipe(
    switchMap(x=>processLog(x))
  ))
).subscribe(x=>console.log(x));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...