【问题标题】:RxJS Merge Observable in CallbackRxJS 在回调中合并 Observable
【发布时间】:2017-09-06 20:25:25
【问题描述】:

我需要一些帮助来让函数返回一个可观察对象。我有一个函数(我们称之为mainFunction),它调用一个异步函数(我们称之为getAsyncWithCallback)并执行一个回调。回调的一部分是一个异步调用,它返回一个 observable(我们称之为getData)。

getAsyncWithCallback 是库的一部分,我无法更改它。

这就是我所拥有的:

mainFunction(){
    getAsyncWithCallback(() => {
        let myObservable = getData();
    });
}

这就是我想做的:

mainFunction().subscribe((data) => { 
    // data is the data from getData()
});

实现这一点的最佳方法是什么,并在内部链接错误和完成?

【问题讨论】:

  • 如果他们不返回myObservable(或将其分配到某个地方),我认为您无能为力...
  • 我很确定您可以使用 promise 并将其转换为 observable。我没有 IDE atm 可以为您提供示例。
  • 回调是我可以更改的代码。我在那里定义了myObservable

标签: typescript rxjs


【解决方案1】:

我的解决方案:

mainFunction(): Observable<any> {

    return Rx.Observable.create(observer => {
        getAsyncWithCallback((): void => {
            getData().subscribe(observer);
        })
    })
}

mainFunction().subscribe((data) => {
    console.log(data);
})); 

【讨论】:

  • 这将创建一个 observable 的 observable,因为 getData 返回一个 Observable。我认为你需要在某处扔一个mergeMap/flatMap
  • 我将其更改为返回一个可观察对象(哎呀!),我很好奇为什么是合并或平面地图?
  • 我认为最好写getData().subscribe(observer)而不是像@Pace建议的那样使用运算符
  • 好吧,你现在所拥有的不会将错误或完成从可观察的源链接到观察者。另外,我认为您的意思是observer.next 而不是Observer.next。 @Oles Savluk 也有一个好点(会链接所有事件),但我仍然不喜欢它,因为它强制订阅内部 observable,即使没有人订阅外部 observable。
  • @RavenDev 看看.subscribe 接受带有Observer 接口的对象,而您的observer 变量实现了该接口。所以基本上它会为你调用observer.nextobserver.errorobserver.complete(而不是像你那样手动编写)
【解决方案2】:

您将希望从mainFunction 返回一个 Observable。

如果 getData 返回一些不是 Observable 的其他类型的对象,您将使用 Observable.create 构造自己的 Observable:

function mainFunction() {
  return Observable.create((obs) => {
    getAsyncWithCallback(() => {
      getData()
        .subscribe((data) => { obs.next(data); })
        .catch((err) => { obs.error(err) });
    });
  });
}

mainFunction().subscribe(data => console.log(data));

来自文档:

create 将 onSubscription 函数转换为实际的 Observable。每当有人订阅该 Observable 时,都会使用 Observer 实例作为第一个也是唯一的参数调用该函数

用一个值调用 next 会将该值发送给观察者。

大多数时候您不需要使用 create,因为现有的操作符允许您为大多数用例创建 Observable。话虽如此,create 是一种低级机制,如果您有非常特定的需求,您可以创建任何 Observable。

还有Observable.from,它将从数组、类数组对象、迭代器、类 Observable 对象和 Promise 创建 Observable。

【讨论】:

  • 第一个选项不能解决这个问题,因为我需要打电话给getAsyncWithCallback()。至于第二个选项,它不会链接错误和完成。将其添加到我的问题中。
  • @Grey 不确定您的意思,在您的示例中,您没有处理回调的失败情况,但这应该是一个好的开始,您可以使用 obs.error() 或obs.complete() 表示错误或可观察对象的完成。
  • @RudolfOlah 你不能在 .subscribe 之后执行 .catch 并且你没有发送完成。最好写.subscribe(obs),正如我在 cmets 中描述的那样,以获得另一个答案
  • @OlesSavluk thx,目前没有控制台可以对此进行测试。我想知道是否可以使用 stackoverflow 可运行代码……也许我们应该创建一个社区 wiki 答案,以便您的 cmets 可以作为答案的一部分显示
猜你喜欢
  • 2017-09-02
  • 1970-01-01
  • 2021-02-02
  • 2020-09-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
相关资源
最近更新 更多