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

有人可以给出一个清晰的定义,以及一个简单的示例,为不懂JavaScript和node.js的人解释什么是“回调地狱”吗?


什么时候(以哪种设置)发生“回调地狱问题”?


为什么会发生?


“回调地狱”是否总是与异步计算相关?


还是在单线程应用程序中也可能发生“回调地狱”?


我在Coursera参加了“反应式课程”,Erik Meijer在他的一次演讲中说RX解决了“回调地狱”的问题。我在Coursera论坛上问什么是“回调地狱”,但我没有明确的答案。


在一个简单的示例上解释了“回调地狱”之后,您还可以说明该简单示例上的RX如何解决“回调地狱问题”吗?


海绵宝宝撒
浏览 664回答 3
3回答

慕的地6264312

只需回答这个问题:您能否在这个简单的例子中也说明RX如何解决“回调地狱问题”?魔术是flatMap。我们可以在Rx中为@hugomg的示例编写以下代码:def getData() = Observable[X]getData().flatMap(x -> Observable[Y])         .flatMap(y -> Observable[Z])         .map(z -> ...)...就像您正在编写一些同步FP代码一样,但是实际上您可以通过使它们异步Scheduler。

吃鸡游戏

为了解决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很渴望,不像可观察对象那样懒惰,并且(通常来说)您不能轻易取消它们。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript