3 回答
TA贡献1817条经验 获得超6个赞
只需回答这个问题:您能否在这个简单的例子中也说明RX如何解决“回调地狱问题”?
魔术是flatMap。我们可以在Rx中为@hugomg的示例编写以下代码:
def getData() = Observable[X]
getData().flatMap(x -> Observable[Y])
.flatMap(y -> Observable[Z])
.map(z -> ...)...
就像您正在编写一些同步FP代码一样,但是实际上您可以通过使它们异步Scheduler。
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很渴望,不像可观察对象那样懒惰,并且(通常来说)您不能轻易取消它们。
添加回答
举报