首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >加入返回的(promise-esq)可观测对象和全局可观测对象

加入返回的(promise-esq)可观测对象和全局可观测对象
EN

Stack Overflow用户
提问于 2018-06-04 03:06:41
回答 1查看 43关注 0票数 0

在我的web应用程序的客户端代码中,我有一个负责一堆websocket IO的类。这个类有一个全局itemUpdatedObservable,UI的各个部分可以订阅它来做一些小事情。还有一个公共函数UpdateItem,它返回一个promise-esq Observable。当更新项以响应对UpdateItem的调用时,我希望同时发出返回的可观察对象和全局可观察对象。返回的可观察对象也应该在发出后完成。

我想出了这个解决方案:

代码语言:javascript
复制
// 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是我实际代码的简化,在现实中有更多的验证和上下文特定的值和参数。

EN

回答 1

Stack Overflow用户

发布于 2018-06-04 11:31:50

也许你可以从创建一些可重用的套接字函数开始,这些函数返回observable。

代码语言:javascript
复制
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=>...)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50669999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档