我正在尝试使用时间到期缓存来处理一个使用窗口上的postMessage
和message
事件抽象“请求 - 响应”的可观察对象。
远程窗口需要一条消息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,但我想知道是否有人可以在没有明确主题的情况下提出解决方案。
提前谢谢!
答案 0 :(得分:0)
我相信您正在寻找rxjs运营商节流:
Documentation on rxjs github repo
返回一个Observable,它只发出由第一个项发出的项 source在指定的连续时间窗口期间可观察 持续时间。
基本上,如果您想等到输入已经安静一段时间后再采取行动,您想要去抖。
如果您根本不想等待,但又希望在特定时间内进行多次查询,则需要限制。从您的用例来看,我认为您想要节流