Resolver 中的链相关 Observable
Chain Dependant Observables in Resolver
我有一个解析器需要在加载页面之前从两个依赖的 API 中获取数据。第二次调用由第一次调用的结果定义,所以我尝试链接这两个可观察对象并且需要 return 解析器末尾的第二个。
在我尝试链接我拥有的可观察对象之前:
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<MySecondObservable> {
const observable1 = this.myService.getFirstDataSet();
observable1.subscribe(
firstDataSet => this.myService.firstDataSet = firstDataSet;
);
const observable2 = this.myService.getSecondDataSet(); // this requires data from firstDataSet
observable2.subscribe(
secondDataSet => this.myService.secondDataSet = secondDataSet;
);
return observable2;
}
这显然是错误的,当我尝试应用一些 RxJs 方法来管理这些可观察对象时,我在第二个可观察对象调用中收到错误消息,指出 firstDataSet 未定义。
这是我到目前为止得到的:
return observable1.pipe(
tap( firstDataSet => this.myService.firstDataSet = firstDataSet),
mergeMap( () => observable2.pipe(
tap(secondDataSet => this.myService.secondDataSet = secondDataSet
)
)
)
在每个可观察的最终结果中,我想将接收到的数据存储到服务中,因此 tap()
。关于 RxJS 的文档非常多,以至于我发现作为初学者很难找到我想要的东西。
感谢您的帮助!
编辑:
我按照提示修改了代码,还是报错
const observable2 = this.myService.getSecondDataSet();
此方法需要解析 firstDataSet 才能工作。但是 myService.firstDataSet
未定义的控制台日志。
如果我理解正确(你想发起一个API调用,等待它完成,然后根据结果再发送一个API请求),那么你需要使用 switchMap 运算符:
return observable1.pipe(
tap( firstDataSet => this.myService.firstDataSet = firstDataSet),
switchMap( observable1Result => observable2 ),
tap(secondDataSet => this.myService.secondDataSet = secondDataSet)
)
我有一个解析器需要在加载页面之前从两个依赖的 API 中获取数据。第二次调用由第一次调用的结果定义,所以我尝试链接这两个可观察对象并且需要 return 解析器末尾的第二个。
在我尝试链接我拥有的可观察对象之前:
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<MySecondObservable> {
const observable1 = this.myService.getFirstDataSet();
observable1.subscribe(
firstDataSet => this.myService.firstDataSet = firstDataSet;
);
const observable2 = this.myService.getSecondDataSet(); // this requires data from firstDataSet
observable2.subscribe(
secondDataSet => this.myService.secondDataSet = secondDataSet;
);
return observable2;
}
这显然是错误的,当我尝试应用一些 RxJs 方法来管理这些可观察对象时,我在第二个可观察对象调用中收到错误消息,指出 firstDataSet 未定义。 这是我到目前为止得到的:
return observable1.pipe(
tap( firstDataSet => this.myService.firstDataSet = firstDataSet),
mergeMap( () => observable2.pipe(
tap(secondDataSet => this.myService.secondDataSet = secondDataSet
)
)
)
在每个可观察的最终结果中,我想将接收到的数据存储到服务中,因此 tap()
。关于 RxJS 的文档非常多,以至于我发现作为初学者很难找到我想要的东西。
感谢您的帮助!
编辑:
我按照提示修改了代码,还是报错
const observable2 = this.myService.getSecondDataSet();
此方法需要解析 firstDataSet 才能工作。但是 myService.firstDataSet
未定义的控制台日志。
如果我理解正确(你想发起一个API调用,等待它完成,然后根据结果再发送一个API请求),那么你需要使用 switchMap 运算符:
return observable1.pipe(
tap( firstDataSet => this.myService.firstDataSet = firstDataSet),
switchMap( observable1Result => observable2 ),
tap(secondDataSet => this.myService.secondDataSet = secondDataSet)
)