我正在尝试使用窗口上的postMessage和message事件,让时间过期缓存为抽象“请求-响应”的可观察对象工作。
远程窗口期望消息getItemList,并用{type: 'itemList', data: []}类型的消息对其进行回复。
我想以这样一种方式对itemList$可观察对象建模,即它将最后一个结果缓存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,但我想知道是否有人可以在没有明确主题的情况下提出解决方案。
提前谢谢你!
发布于 2016-07-27 19:30:48
我相信你在找rxjs运营商throttle。
Documentation on rxjs github repo
返回一个可观察对象,该对象在指定持续时间的连续时间窗口内仅发出源可观察对象发出的第一个项。
基本上,如果你想等到输入静默一段时间后再采取行动,你会想要对进行去抖动。
如果您根本不想等待,但又不希望在特定的时间内执行1个以上的查询,那么您将希望对进行。从您的用例来看,我认为您应该对进行限制
https://stackoverflow.com/questions/37137669
复制相似问题