我试图找到最干净的解决方案和操作,以链观测。
我的要求如下:
从路由参数中检索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>
附带说明:您应该将此功能真正导出到服务中;)