用observable替换回调地狱

时间:2016-05-22 21:42:31

标签: javascript callback reactive-programming rxjs

RxJS github repo解释了如何从事件或数组创建observable。我知道如何用异步或Promise替换回调地狱,但是我找不到一个如何创建和返回我的函数执行异步任务的observable的例子。

For example

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()方法,但无法找出此示例的实现。

1 个答案:

答案 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.fromCallbackRx.Observable.fromNodeCallback
  • 将回调包装在您自己的可观察对象中。看看这里:rx.js how to chain observables

例如,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执行顺序事项),如前所示。