RxJS github repo解释了如何从事件或数组创建observable.我知道如何用异步或Promise替换回调地狱,但我找不到一个关于如何创建和返回我的函数执行异步任务的observable的示例.
x = getData();
y = getMoreData(x);
z = getMoreData(y);
...
getData(function(x){
getMoreData(x, function(y){
getMoreData(y, function(z){
...
});
});
});
如何用observable替换这个回调地狱?我发现我们可以在RxJS github – creating observable中调用observer.next()方法,但无法找出此示例的实现.
解决方法:
您可以使用flatMap运算符来链接结果.看看这里:RxJS Promise Composition (passing data).基本链接承诺与链接flatMap相同.那是 :
pl().then(p2).then(p3).then(console.log);
类似于 :
Rx.Observable.just()
.flatMap(p1)
.flatMap(p2)
.flatMap(p3);
因此,从承诺到可观察的过渡很简单.如果你有一个使用回调而不是承诺操作的函数,我可以考虑两个选项:
>尝试使用Rx.Observable.fromCallback或Rx.Observable.fromNodeCallback
>将回调包装在您自己的可观察对象中.看看这里:rx.js how to chain observables
例如,函数asyncCall(param,cb)将导致类似于:
Rx.Observable.create (function(observer){
asyncCall(param, function cb(err, data){
if (err) {observer.onError(err)}
else {
observer.onNext(x);
// The following is supposing your callback is only called once, so there is no more data
observer.onCompleted();
}
}
})
完成后,您可以使用flatMap(或concatMap,如果执行顺序很重要),如前所示.