在我的web应用程序的客户端代码中,我有一个负责一堆websocket IO的类。这个类有一个全局itemUpdatedObservable
,UI的各个部分可以订阅它来做一些小事情。还有一个公共函数UpdateItem
,它返回一个promise-esq Observable。当更新项以响应对UpdateItem
的调用时,我希望同时发出返回的可观察对象和全局可观察对象。返回的可观察对象也应该在发出后完成。
我想出了这个解决方案:
// Singleton
class API {
readonly itemUpdatedObservable: Observable<Item>;
private pendingItemUpdates: { [id: string]: Observer<Item> };
constructor() {
this.itemUpdatedObservable = new Observable(observer => {
socketio.on('itemUpdated', res => {
// do a bunch of validation on item
// ...
if (!res.error) {
observer.next(res.item);
} else {
observer.error(res.error);
}
let pendingObs = pendingItemUpdates[res.id]
if (pendingObs) {
if (!res.error) {
pendingObs.next(res.item);
} else {
pendingObs.error(res.error);
}
pendingObs.complete()
delete pendingItemUpdates[res.id];
}
})
});
this.pendingItemUpdates
}
public UpdateItem(item: Item): Observable<Item> {
const o = new Observable(observer => {
let id = uniqueId(); // Some helper somewhere.
this.pendingItemUpdates[id] = observer;
socketio.emit('updateitem', {item: item, id: id});
}).publish();
o.connect();
return o;
}
}
我的问题是,有没有一种更干净、更快捷的方法来做这件事?除了itemUpdatedObservable
之外,我还有一些像10+可观察到的东西,它们都是不同对象类型的事件。这段代码是凌乱和笨拙的,特别是当我把它写10倍的时候。有没有办法简化这两个观察量,使我只调用observable.next(...)
或observable.error(...)
一次?
上面的代码blob是我实际代码的简化,在现实中有更多的验证和上下文特定的值和参数。
发布于 2018-06-04 11:31:50
也许你可以从创建一些可重用的套接字函数开始,这些函数返回observable。
const socketOn = (event) => {
return Observable.create(obs => {
socketio.on(event, res => {
if (!res.error) {
obs.next(res.item);
} else {
obs.error(res.error);
}
})
}).share()
}
// usuage
itemUpdated$=socketOn('itemUpdated')
itemUpdated$.map(res=>...).catch(e=>...)
https://stackoverflow.com/questions/50669999
复制相似问题