【问题标题】:Wrapping event handler callback in Observable在 Observable 中包装事件处理程序回调
【发布时间】:2019-07-31 04:22:16
【问题描述】:

我正在尝试找到一种将事件回调从库包装到 RxJS Observable 的模式。

我正在使用的库为这样的事件注册处理程序:

const someHandler = (args) => {}`;
const resultCallback = (result) => {}`;

Library.addHandler('SOME_EVENT', someHandler, resultCallback);
Library.removeHandler('SOME_EVENT', someHandler, resultCallback);

resultCallback 是一个回调,如果处理程序注册成功则返回。


理想情况下,我想将处理程序作为函数的参数传入,并发出它的结果。

我不知道如何从这个函数发出处理程序的值,同时还保持对处理程序的对象引用以供删除。

addEventHandlerObservable<T>(handler: any): Observable<T> {

    return new Observale(observer => {

        SomeLibrary.addHandler('SOME_EVENT', handler,
        (result) => { 
            // was registered successfully?
            if(result.failed) {
                observer.error();
                observer.complete();
            }
        });

    });

}

【问题讨论】:

  • @AluanHaddad fromEvent 仅适用于特定事件目标。这不是其中之一

标签: javascript typescript rxjs observable


【解决方案1】:

rxjs 已经为你做了这个,fromEventPattern observable。

const resultCallback = (result) => {}; // not hyper clear on the point of this

const events$ = fromEventPattern(
  (handler) => Library.addHandler('SOME_EVENT', handler, resultCallback),
  (handler) => Library.removeHandler('SOME_EVENT', handler, resultCallback);
);

您不会在此处“传入”处理程序。您的订阅就是您的处理程序:

events$.subscribe((val) => someHandler(val));

【讨论】:

  • 谢谢,“你没有通过”是它点击的地方。
  • “resultCallback”是实际注册处理程序结果的异步回调,因为在某些情况下它可能会失败,这就是库返回结果的方式。所以我需要在它发生的情况下取消订阅。
  • 在这种情况下,我会说使该函数类似于 (result) =&gt; { if (result.failed) { throw new Error('Event registration failed!'); } } 应该导致 observable 出错
  • 谢谢,抛出错误并不能完成 observable。但是如果它失败了,我可以用一个标志在 takeWhile() 上进行管道传输。
  • 是的,如果您的目标是完成,这将有效。我只是想你可能希望它在失败的情况下转到错误处理程序
猜你喜欢
  • 2019-11-18
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多