RxJ使用Scan和DebounceTime对网络呼叫进行速率限制,使扫描控制器无效

时间:2017-11-23 08:55:44

标签: angular rxjs ngrx

我正在使用ngrx来维护我的应用程序中的状态。 我需要经常更新服务器当前的应用程序状态,但我不想用太多的请求来压倒服务器。

我的@effect就像是

@Injectable()
class MyEffect {
    @Effect()
    effect = this.action.ofType(UPDATE)
        .scan(collectAllChanges,emptyValue)
        .debounceTime(2000)
        .switchMap(data => update(data).map(() => new UpdateStoreAction(data)));
}

CollectAllChanges是一种获取最后accumulated值和新changes并构建新accumulated值的方法

现在我要求的是accumulated运算符发出时scan运算符中的debounceTime值无效。

任何提示?

1 个答案:

答案 0 :(得分:2)

使用.bufferTime(2000)可能更容易让所有更改每2秒累积和传播一次,而不是手动执行此操作?

如果您希望将去抖退避与常规buffer()结合使用,您还可以执行以下操作:

const source = this.action.ofType(UPDATE); source   
  .buffer(source.debounceTime(2000))   
  .switchMap(buffer => update(buffer)
    .mapTo(new UpdateStoreAction(data))
  );

这样,所有操作都会被缓冲,直到源在发出缓冲区之前静默2秒。