用observable替换回调地狱

Ank*_*ush 3 javascript callback reactive-programming rxjs

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){ 
            ...
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

如何用observable替换这个回调地狱?我发现我们可以在RxJS github中调用observer.next()方法- 创建observable但是无法找出这个例子的实现.

use*_*222 5

您可以使用flatMap运算符来链接结果.看看这里:RxJS Promise Composition(传递数据).基本上链接承诺与链接相同flatMap.那是 :

pl().then(p2).then(p3).then(console.log);
Run Code Online (Sandbox Code Playgroud)

类似于 :

 Rx.Observable.just()
         .flatMap(p1)
         .flatMap(p2)
         .flatMap(p3);
Run Code Online (Sandbox Code Playgroud)

因此,从承诺到可观察的过渡很简单.如果你有一个使用回调而不是承诺操作的函数,我可以考虑两个选项:

  • 尝试使用Rx.Observable.fromCallbackRx.Observable.fromNodeCallback
  • 将回调包装在您自己的可观察对象中.看看这里:rx.js如何链接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();
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

一旦完成,您可以使用flatMap(或concatMap执行顺序)如前所示.