继续延迟HTTP请求,直到新的params到达

时间:2016-06-01 11:51:39

标签: rxjs rxjs5

假设我们有一个函数getIds(),它接受一些id的数组 像这样:

getIds([4, 1, 32]);

此函数会将HTTP调用延迟100ms。但如果这是100毫秒 再次调用相同的函数:

getIds([1, 8, 5]);

它将重置100ms计时器并保持合并传递的ID。它会 只有在没有人调用超过100毫秒的情况下才发送HTTP请求。

我是RxJS的新手,这是我尝试解决这个问题,但我有 感觉可以更好地解决这个问题。

https://jsfiddle.net/iFadey/v3v3L0yd/2/

function getIds(ids) {
  let observable = getIds._observable,
      subject = getIds._subject;

  if (!observable) {
    subject = getIds._subject = new Rx.ReplaySubject();
    observable = getIds._observable = subject
      .distinct()
      .reduce((arr, id) => {
        arr.push(id);
        return arr;
      }, [])
      // Some HTTP GET request will go here
      // whose results may get flatMapped here
      .publish()
      .refCount()
      ;
  }

  ids.forEach((id) => {
    console.log(id);
    subject.next(id);
  });

  clearTimeout(getIds._timer);
  getIds._timer = setTimeout(() => {
    getIds._observable = null;
    getIds._subject = null;
    subject.complete();
  }, 100);

  return observable;
}

getIds([1, 2, 3])
.subscribe((ids) => {
  console.log(ids);
});

getIds([3, 4, 5])
.subscribe((ids) => {
  console.log(ids);
});

修改 我正在寻找一个像debounce一样但不丢弃先前值的运算符。相反,它必须排队。

1 个答案:

答案 0 :(得分:0)

我不确定是否准确捕获了您正在寻找的以下哪一项,因此我将简单地描述两者。有两种基于时间的模式"根据我的经验,这些问题最常适合此类问题:

  • 去抖

rxmarbles url:http://rxmarbles.com/#debounce; github doc

正如文档中所述,

  

在特定时间跨度后从源Observable发出一个项目   已经过了没有Observable省略任何其他项目。

  • 油门

rxmarbles url:还没有; github doc

  

返回一个Observable,它只发出由第一个项发出的项   source在指定的连续时间窗口期间可观察   持续时间。

基本上,如果您想等到输入已经安静一段时间后再采取行动,您想要去抖。如果您根本不想等待,但又不希望在特定时间内进行多次查询,则需要加油

希望它有意义。