gpt4 book ai didi

javascript - 用 observable 替换回调 hell

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:01:18 27 4
gpt4 key购买 nike

RxJS github repo解释如何从事件或数组创建可观察对象。我知道如何用异步或 Promise 替换回调 hell ,但我找不到有关如何为执行异步任务的函数创建和返回可观察对象的示例。

For example ,

x = getData();
y = getMoreData(x);
z = getMoreData(y);
...

getData(function(x){
getMoreData(x, function(y){
getMoreData(y, function(z){
...
});
});
});

如何用可观察对象替换这个回调 hell ?我发现我们可以在 RxJS github - creating observable 中调用 observer.next() 方法但无法找出此示例的实现。

最佳答案

您可以使用 flatMap 运算符来链接结果。在这里看看:RxJS Promise Composition (passing data) .基本上,链接 promise 与链接 flatMap 是一样的。那就是:

pl().then(p2).then(p3).then(console.log);

类似于:

 Rx.Observable.just()
.flatMap(p1)
.flatMap(p2)
.flatMap(p3);

因此,从 promises 到 observables 的转换很简单。如果你有一个使用回调而不是 promise 操作的函数,我可以想到两个选项:

  • 尝试使用 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),如前所示。

关于javascript - 用 observable 替换回调 hell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37379947/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com