如何用rxjs解决回调地狱

发布于 2022-09-05 20:33:53 字数 690 浏览 13 评论 0

当下一个请求依赖于前一个请求的响应时,原生js会遇到callback hell的问题:

makeHttpCall('/items', 
   items => {
      for (itemId of items) {
         makeHttpCall(`/items/${itemId}/info`,
           itemInfo => { 
              makeHttpCall(`/items/${itemInfo.pic}`,
                img => {
                    showImg(img);
              });   
           });
      }
});
beginUiRendering();

利用promise可以解决:

makeHttpCall('/items')
    .then(itemId => makeHttpCall(`/items/${itemId}/info`))
    .then(itemInfo => makeHttpCall(`/items/${itemInfo}.pic}`))
    .then(showImg);

那么使用rxjs,应该如何解决相同的问题?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

城歌 2022-09-12 20:33:54

这个例子上 Observable (异步计算的多个结果) 并不比Promise (异步计算的唯一结果) 更方便。因为每个计算 (makeHttpCall, showImg) 就只有一个结果。

一定要用Rx自然也能做,写出来应该会发现和Promise的版本区别不大,只是then变成了flatMap。

乖不如嘢 2022-09-12 20:33:54

flatMap或者concatMap操作符把内部的事件流合并到主事件流上,逻辑上形容就是把上一个主事件流映射为若干子事件,之后再把子事件的结果作为一个新流拼接到主事件流上。

详见:concatMap

风吹过旳痕迹 2022-09-12 20:33:54
makeHttpCall('/items')
    .mergeMap(itemIds =>
        Observable.from(itemIds)
        .mergeMap(id => makeHttpCall(`/items/${id}/info`)
            .mergeMap(itemInfo => makeHttpCall(`items/${itemInfo}/pic`))))
    .subscribe(img => showImg(img));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文