javascript – 用observable替换回调地狱

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){ 
            ...
        });
    });
});

如何用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,如果执行顺序很重要),如前所示.

上一篇:javascript – RxJS将当前值推送给后期订阅者


下一篇:javascript – 一个Observable,多个订阅者,不同的案例,使用rxjs5的不同share()行为