首页 > 解决方案 > ngrx + 量角器 - 竞争条件

问题描述

我的应用程序有一个问题,只有在我运行 e2e 测试(量角器)时才会变得明显。在我看来,我通过服务有 2 个 API 调用。

发生的事情是whenStable在数据显示在屏幕上之前调用。我最初认为这是一个量角器问题,但似乎不是。

守卫代码:

  getTestData(): Observable<boolean> {
    return this.testService
      .callApiA()
      .pipe(
        map( data => new TestStartAction({value: data })),
        tap(action => this.store.dispatch(action)),
        map(Boolean)
      );
  }

  getTestData2(): Observable<boolean> {
    return this.testService
      .callApiB()
      .pipe(
        map( kase => new TestStartAction({value: data })),
        tap(action => this.store.dispatch(action)),
        map(Boolean)
      );
  }

  canActivate(): Observable<boolean> {
    return this.getTestData()
      .pipe(
        switchMap( () => this.getTestData2() )
      );
  }

当我运行应用程序时,一切都加载并显示正常。但是,当我运行 e2e 测试时,expect 在显示任何数据之前被调用得太早(我可以看到它确实加载正确)。似乎存在某种竞争条件(很少通过)。此外,有效载荷越大,失败的可能性就越大。

我需要进行多次调用,因为在使用下一个 API 之前我需要来自第一个 API 的数据。

有没有人在使用 ngrx 4、Angular 5 和量角器时遇到过这样的问题?

任何想法或帮助将不胜感激。

标签: javascriptangularprotractorngrx

解决方案


我认为您应该使用除switchMap. 在您的特定情况下,我认为canActivate发出getTestData1()或者getTestData2()发出。因此,您的数据不会在完成时加载。

文档说:

不过要小心,您可能希望避免在每个请求都需要完成的情况下使用 switchMap。

=> https://www.learnrxjs.io/operators/transformation/switchmap.html

concat是你想要的。

canActivate(): Observable<boolean> {
  return this.getTestData()
  .pipe(concat(this.getTestData2()));
}

我在这里看到的另一个问题是,它getTestData()已经getTestData2()完成store.dispatch(action)了。但这仅意味着触发了操作。动作的效果和执行可能还没有完成。


推荐阅读