RxJS在回调中合并Observable

时间:2017-09-05 19:15:09

标签: typescript rxjs

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

getAsyncWithCallback是图书馆的一部分,我无法改变它。

这就是我所拥有的:

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

这就是我想要做的事情:

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

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

2 个答案:

答案 0 :(得分:2)

我的解决方案:

mainFunction(): Observable<any> {

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

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

答案 1 :(得分:0)

您需要从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的对象和Promises创建Observable。