RxJS zip和管道组合无法使用

问题描述 投票:0回答:1

我需要等待两个服务器调用。但是,用户可以决定是否进行第二次服务器调用。所有这些都是在Angular Resolver中发生的,因为下一页需要数据。

问题是,从我的zip函数中,代码从未到达管道,而使我陷于解析器中。步骤如下:

  1. 压缩我的请求

  2. 用管道输送

  3. 并将一个可观察的返回给我的解析函数

这是我的代码:

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,因此导航永远不会发生。

javascript angular typescript promise rxjs
1个回答
0
投票

根据文档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);
    }));
© www.soinside.com 2019 - 2024. All rights reserved.