RxJS 5定时缓存

时间:2016-05-10 11:48:28

标签: caching rxjs rxjs5

我正在尝试使用时间到期缓存来处理一个使用窗口上的postMessagemessage事件抽象“请求 - 响应”的可观察对象。

远程窗口需要一条消息getItemList,并使用{type: 'itemList', data: []}类型的消息回复该消息。

我想以这样的方式对itemList$ observable进行建模,以便将最后一个结果缓存3秒,以便在此期间不会发出任何新请求,但是,我想不出一种方法可以实现在优雅(阅读,一个可观察 - 没有主题)和succint方式。

以下是代码中的示例:

const remote = someIframe.contentWindow;
const getPayload = message => message.data;
const ofType = type => message => message.type === type;

// all messages coming in from the remote iframe
const messages$ = Observable.fromEvent(window, 'message')
  .map(getPayload)
  .map(JSON.parse);

// the observable of (cached) items
const itemList$ = Observable.defer(() => {
    console.log('sending request');

    // sending a request here, should happen once every 3 seconds at most
    remote.postMessage('getItemList');

    // listening to remote messages with the type `itemList`
    return messages$
      .filter(ofType('itemList'))
      .map(getPayload);
  })
  .cache(1, 3000);

/**
 * Always returns a promise of the list of items
 * @returns {Promise<T>}
 */
function getItemList() {
  return itemList$
    .first()
    .toPromise();
}


// poll every second
setInterval(() => {
  getItemList()
    .then(response => console.log('got response', response));
}, 1000);

我知道the (very similar) question,但我想知道是否有人可以在没有明确主题的情况下提出解决方案。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

我相信您正在寻找rxjs运营商节流

Documentation on rxjs github repo

  

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

基本上,如果您想等到输入已经安静一段时间后再采取行动,您想要去抖

如果您根本不想等待,但又希望在特定时间内进行多次查询,则需要限制。从您的用例来看,我认为您想要节流