我需要一些帮助,使函数返回一个observable。我有一个函数(让我们称之为mainFunction
),它调用异步函数(让我们称之为getAsyncWithCallback
)并执行回调。部分回调是一个异步调用,它返回一个observable(让我们称之为getData
)。
getAsyncWithCallback
是图书馆的一部分,我无法改变它。
这就是我所拥有的:
mainFunction(){
getAsyncWithCallback(() => {
let myObservable = getData();
});
}
这就是我想要做的事情:
mainFunction().subscribe((data) => {
// data is the data from getData()
});
实现这一目标的最佳方法是什么,并在错误和完成中形成内部链?
答案 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。