【问题标题】:RxJS zip and pipe in combination not workingRxJS zip和管道组合不起作用
【发布时间】:2020-03-24 08:17:41
【问题描述】:

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

问题是,从我的 zip 函数中,代码永远不会到达管道,让我卡在解析器中。流程如下:

  1. 压缩我的请求

  2. 管道

  3. 并向我的解析函数返回一个 observable

这是我的代码:

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,但这些问题是我无法在出现错误的情况下永远完成 Promise,因此导航永远不会发生。

【问题讨论】:

    标签: javascript angular typescript promise rxjs


    【解决方案1】:

    根据文档http://reactivex.io/documentation/operators/zip.htmlzip() 接受许多可观察的参数,但您提供了一个数组。它可能会有所帮助:

    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);
        }));
    

    【讨论】:

    • 嘿!确实有效。但是,即使发生错误,解析器也会解析。这意味着我仍然可以到达解析器后面的页面,并且那里的一切都崩溃了。这就是我订阅解析器返回值的方式:this.activatedRoute.data.subscribe((data) =&gt; {// do stuff here }); 但是,如果出现问题并且我调用return EMPTY,我认为解析器不应该解析并且导航永远不会发生?
    • 实际上,我必须纠正自己。在解析器中,一切都成功完成,但是解析器完成后订阅功能中的处理不起作用。不知何故,返回值的类型不是正确的。如果我从 Car 类型记录返回的对象,它具有所有属性,但 if(data.car instanceof Car) 返回 false。我想这是我现在的错误。
    • 好的,我找到了问题!订阅时,您必须考虑如何在路由中使用解析器。例如:resolve: { myresolver: MyResolverService} 现在您必须像这样订阅和访问您的数据:..subscribe((data: {myresolver:{whateverYouReturnedFromResolver}}) =&gt; ... 感谢@katzz0 帮助我使用 zip 功能。 !!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 2021-01-22
    • 2022-11-23
    • 1970-01-01
    相关资源
    最近更新 更多