可观察的民意调查?

Cha*_*lie 5 angular

我目前有一个Observable计时器:

private poller(): Observable<PrepareData> {
    return Observable.timer(0, 5000).switchMap(() => this.http.get("/cgi/dashboard.php")).map(res => res.json());
}
Run Code Online (Sandbox Code Playgroud)

我想拥有它,所以在最后一个完成后5秒完成获取请求.有什么简单的方法吗?

n00*_*dl3 11

我会在@ Maxime的答案中添加我的答案,但实际上不需要一个主题.

这是使用.concat()运算符和getData()函数递归完成的.

.concat()

通过顺序发出它们的值来连接多个Observable,一个Observable接着另一个.

(......)

concat将订阅第一个输入Observable并发出其所有值,而不以任何方式更改或影响它们.当Observable完成时,它将订阅然后传递下一个Observable,并再次发出其值.这将重复,直到操作员用尽Observables.当最后一个输入Observable完成时,concat也将完成.

(我使用js版本来制作一个与Stack Overflow工具一起使用的片段,但这对于typescript来说是相同的):

function someHTTPCall() {
  // well it's a fake http call
  console.log("making the Http request (can take up to 5s)...");
  return Rx.Observable.of("http response !")
    .delay(Math.round(Math.random() * 5000));
}

function getData() {
  return someHTTPCall()
    .concat(Rx.Observable.timer(5000).switchMap(() => getData()));
}

let myObs = getData();

myObs.subscribe((data) => {
  console.log(data,"waiting for 5 seconds before next request");
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/rxjs@5.4.0/bundles/Rx.min.js"></script>
Run Code Online (Sandbox Code Playgroud)


max*_*992 5

这是一个有趣的问题,我有一些乐趣来提出解决方案.

此解决方案等待前一个按预期完成:

const { Observable, Subject } = Rx

const getFakeHttpRequest$ = () => Observable.of('response !').delay(3000)

const polling$ = new Subject()

Observable
  // need to tick the first time
  .of(null)
  // everytime our polling$ subject will emit, we'll do again what's next
  .merge(polling$)
  // register to a fake request
  .switchMap(_ =>
    getFakeHttpRequest$()
      .do(_ => {
        // once we're here, the request is done
        // no mater how long it was to get a response ...
        console.log('HTTP request done !');

        // ... we wait 5s and then send a new value to polling$ subject
        // in order to trigger a new request
        setTimeout(_ => polling$.next(null), 5000)
      })
  )
  .subscribe()
Run Code Online (Sandbox Code Playgroud)

请注意,我已经在请求上放了3秒延迟,并且每8秒发出一个新请求,因为我们等待响应3秒,然后在问题中请求5秒.

这是一个有效的Plunkr:https://plnkr.co/edit/kXefUbPleqyyUOlfwGuO p = info