使用RXJS的Angular 5 $ http轮询

时间:2018-12-17 16:50:01

标签: rxjs angular5 polling

我正在尝试创建一个轮询服务,这就是我所实现的。 目标是进行轮询,当响应包含某个值(例如running: false)时可以停止轮询

// Sample call
  _getData(): Observable<any> {
    return new Observable((observer) => {
      setTimeout(() => {
        observer.next({ data: "bar", running: true });
      }, 2000)
    })
  }

  start() {
    timer(0, 5000)
      .pipe(
        concatMap(() => from(this._getData())
        .pipe(map(response => response))
        )
      )
     // .pipe(filter(backendData => backendData.running === true))
      .subscribe(() => console.info("CIAO" + ++calls))
  }

问题是,它会触发一次。 我在做什么错了?

1 个答案:

答案 0 :(得分:1)

这是因为concatMap等到其内部Observable完成。

在您的_getData中,您返回new Observable,然后自己调用next(),但是从不调用complete(),因此Observable保持打开状态。然后concatMap将永远不会再调用其项目方法,因为它正在等待先前的Observable完成。