我需要等待两个服务器调用。但是,用户可以决定是否进行第二次服务器调用。所有这些都是在Angular Resolver中发生的,因为下一页需要数据。
问题是,从我的zip函数中,代码从未到达管道,而使我陷于解析器中。步骤如下:
压缩我的请求
用管道输送
并将一个可观察的返回给我的解析函数
这是我的代码:
public resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):
Observable<any> | Promise<any> { //
const id = +route.paramMap.get('id');
const wantsSecondRequest = +route.paramMap.get('wantsSecondRequest');
const requests: Array<Observable<any>> = new Array();
requests.push(firstServerCallHappensHere());
if (wantsSecondRequest === 1) {
requests.push(secondServerCallHappensHere());
}
return zip(requests).pipe(take(1), mergeMap(([a, b]) => {
// DO STUFF WITH MY REQUESTS
return of(a);
}));
}
我尝试使用Promise.all并使用Promises而不是Observables,但是这些问题是,在发生错误的情况下,我永远无法完成Promises,因此导航永远不会发生。
根据文档http://reactivex.io/documentation/operators/zip.html zip()
接受许多可观察到的参数,但您提供了一个数组。这可能会有所帮助:
public resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):
Observable<any> | Promise<any> { //
const id = +route.paramMap.get('id');
const wantsSecondRequest = +route.paramMap.get('wantsSecondRequest');
return zip(
firstServerCallHappensHere(),
wantsSecondRequest === 1 ? secondServerCallHappensHere() : undefined,
).pipe(take(1), mergeMap(([a, b]) => {
// DO STUFF WITH MY REQUESTS
return of(a);
}));