【发布时间】:2016-05-10 11:48:28
【问题描述】:
我正在尝试使用窗口上的postMessage 和message 事件让时间到期缓存为抽象“请求-响应”的可观察对象工作。
远程窗口需要一条消息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$的末尾就可以了。谁能确认这是正确的方法?