为了账号安全,请及时绑定邮箱和手机立即绑定

什么是“回调地狱”,RX如何以及为什么解决它?

什么是“回调地狱”,RX如何以及为什么解决它?

海绵宝宝撒 2019-12-12 14:46:25
有人可以给出一个清晰的定义,以及一个简单的示例,为不懂JavaScript和node.js的人解释什么是“回调地狱”吗?什么时候(以哪种设置)发生“回调地狱问题”?为什么会发生?“回调地狱”是否总是与异步计算相关?还是在单线程应用程序中也可能发生“回调地狱”?我在Coursera参加了“反应式课程”,Erik Meijer在他的一次演讲中说RX解决了“回调地狱”的问题。我在Coursera论坛上问什么是“回调地狱”,但我没有明确的答案。在一个简单的示例上解释了“回调地狱”之后,您还可以说明该简单示例上的RX如何解决“回调地狱问题”吗?
查看完整描述

3 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

只需回答这个问题:您能否在这个简单的例子中也说明RX如何解决“回调地狱问题”?


魔术是flatMap。我们可以在Rx中为@hugomg的示例编写以下代码:


def getData() = Observable[X]

getData().flatMap(x -> Observable[Y])

         .flatMap(y -> Observable[Z])

         .map(z -> ...)...

就像您正在编写一些同步FP代码一样,但是实际上您可以通过使它们异步Scheduler。


查看完整回答
反对 回复 2019-12-12
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

为了解决Rx如何解决回调地狱的问题:


首先,让我们再次描述回调地狱。


假设有一个案例,我们必须使用http来获取三种资源-人,星球和星系。我们的目标是找到一个人居住的星系。首先我们必须让这个人,然后是行星,再到星系。这是三个异步操作的三个回调。


getPerson(person => { 

   getPlanet(person, (planet) => {

       getGalaxy(planet, (galaxy) => {

           console.log(galaxy);

       });

   });

});

每个回调都是嵌套的。每个内部回调都依赖于其父级。这导致回调地狱的“厄运金字塔”风格。该代码看起来像一个>符号。


要在RxJs中解决此问题,您可以执行以下操作:


getPerson()

  .map(person => getPlanet(person))

  .map(planet => getGalaxy(planet))

  .mergeAll()

  .subscribe(galaxy => console.log(galaxy));

使用mergeMapAKA flatMap运算符,您可以使其更加简洁:


getPerson()

  .mergeMap(person => getPlanet(person))

  .mergeMap(planet => getGalaxy(planet))

  .subscribe(galaxy => console.log(galaxy));

如您所见,代码是扁平化的,并且包含单个方法调用链。我们没有“厄运金字塔”。


因此,避免了回调地狱。


万一您想知道,promise是避免回调地狱的另一种方法,但是promise很渴望,不像可观察对象那样懒惰,并且(通常来说)您不能轻易取消它们。


查看完整回答
反对 回复 2019-12-12
  • 3 回答
  • 0 关注
  • 663 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信