我试图找到最干净的解决方案和操作,以链观测。
我的要求如下:
从路由参数中检索auserAccountToken
使用userAcccountToken对后端进行http调用
再次使用userAcccountToken对后端执行另一个http调用
最后导航到一条路线(即/dashboard),如果所有路线都比这条路线好得多。
我的角2分量如下:

import {Component, OnInit} from '@angular/core';
import {UserAccountService} from '../useraccount.service';
import {ActivatedRoute, Router} from '@angular/router';
import {SessionService} from '../../session/session.service';


@Component({
  templateUrl: 'useraccount-activation.component.html'
})
export class UserAccountActivationComponent implements OnInit {

  constructor(private userAccountService: UserAccountService,
              private sessionService: SessionService,
              private router: Router,
              private route: ActivatedRoute) {
  }

  ngOnInit() {
    this.route.params.map(params => params['userAccountToken'])//1.
      .switchMap(userAccountToken => this.userAccountService.activateAccount(userAccountToken))//2.
      .switchMap(() => this.sessionService.signinByUserAccountToken('???'))//3.
      .subscribe(() => this.router.navigate(['/dashboard']));//4.
  }
}

问题是,我需要在两个地方使用userAccountToken,但我需要订阅两个http调用,以便执行它们。
我可以在2之间再做一次。3。但这似乎在重复我自己。
我可以用一个this.route.params.map(...)实例变量在组件中引入state,但是我的函数会产生副作用。
有什么办法可以彻底解决这个问题?
编辑:以下代码:
  ngOnInit() {
    this.route.params.map(params => params['userAccountToken'])
      .mergeMap(userAccountToken => Observable.concatAll(
        this.userAccountService.activateAccount(userAccountToken),
        this.sessionService.signinByUserAccountToken(userAccountToken)
      ))
      .subscribe(() => this.router.navigate(['/dashboard']));
  }

产生以下错误:
__WEBPACK_IMPORTED_MODULE_4_rxjs_Observable__.Observable.concatAll is not a function

即使我已经导入userAccountToken
编辑2:我得到上述错误的原因是我在import 'rxjs/add/operator/concatAll';上使用了concatAll,而不是在Observable类型的实例/对象上。

最佳答案

假设两个后端调用可以并行完成,则可以使用forkJoin。如果必须一个接一个地执行此操作,则可以使用嵌套mergeMap

const token$ = Rx.Observable.of('token')

token$
  .mergeMap(token => Rx.Observable.forkJoin(
    Rx.Observable.of(token),
    Rx.Observable.of(token)
  ))
  .subscribe(val => console.log(val));

<script src="https://npmcdn.com/@reactivex/[email protected]/dist/global/Rx.umd.js"></script>

附带说明:您应该将此功能真正导出到服务中;)

09-19 08:20