【问题标题】:Observable - set constant delay between one poll return and another poll startObservable - 在一个轮询返回和另一个轮询开始之间设置恒定延迟
【发布时间】:2019-04-30 08:08:34
【问题描述】:

我想创建一个基于 Observable 的轮询器,它在上一个请求返回和下一个请求发出之间等待一定的时间。

这是我尝试过的代码,但这会在发出请求之间设置延迟:

import {timer} from "rxjs";

    this.timer = timer(1, POLLING_INTERVAL)
     .pipe(concatMap(
        (_) => getData()
      )).subscribe((data) => {
        // do something with data     
      });

【问题讨论】:

标签: rxjs rxjs6


【解决方案1】:

timer 不适合这个。而是将repeatWhendelay 一起使用。

import { of } from 'rxjs';
import { repeatWhen, delay } from 'rxjs/operators';

getData().pipe(
  repeatWhen(notifications => notifications.pipe(
    delay(POLLING_INTERVAL),
  )),
).subscribe(...);

现场演示:https://stackblitz.com/edit/rxjs-2evzzi

【讨论】:

  • 这不会也延迟第一个请求吗?
  • 否,因为repeatWhen 传递所有next 通知并仅捕获complete 通知。如果getData() 先发出next 然后completenext 不会被延迟。
  • 好的,这行得通,只是在每次轮询期间需要调用getData,这取决于闭包中更改的变量。
  • 实际上,它似乎根本不会多次调用getData,所以这不是我想要的。
  • @ilancohen 如果您每次都需要拨打getData,请尝试defer(()=>getData()).pipe(repeatWhen(...))。原始答案暗示您的逻辑仅包含在源可观察订阅逻辑中。
【解决方案2】:

您必须将创建间隔用于: https://stackblitz.com/edit/typescript-ohddud?file=index.ts&devtoolsheight=100 或带两个参数的定时器: https://stackblitz.com/edit/typescript-h9pzxr?file=index.ts&devtoolsheight=100

希望您以正确的方式合并请求。

【讨论】:

  • 我认为您没有理解这个问题。我想: 1. 发送请求(即调用异步函数) 2. 等待它返回 3. 等待 X 秒 4. 发送另一个请求,等等。
  • 现在我明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多