【问题标题】:RxJS 5 Timed CacheRxJS 5 定时缓存
【发布时间】:2016-05-10 11:48:28
【问题描述】:

我正在尝试使用窗口上的postMessagemessage 事件让时间到期缓存为抽象“请求-响应”的可观察对象工作。

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

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

这是代码中的示例:

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,但我想知道是否有人可以提出没有明确主题的解决方案。

提前谢谢你!

【问题讨论】:

  • 看起来.repeat() 附加到itemList$ 的末尾就可以了。谁能确认这是正确的方法?

标签: caching rxjs rxjs5


【解决方案1】:

相信你在找rxjs操作符throttle

Documentation on rxjs github repo

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-09
    • 2022-08-03
    • 2016-07-22
    • 1970-01-01
    • 2011-10-22
    • 2017-01-22
    • 2014-12-23
    • 1970-01-01
    相关资源
    最近更新 更多