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){
...
});
});
});
如何用observables替换此回调地狱?我发现我们可以在RxJS github - creating observable中调用observer.next()方法,但无法找出此示例的实现。
答案 0 :(得分:5)
您可以使用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
例如,function 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
执行顺序事项),如前所示。