3 回答

TA貢獻1817條經(jīng)驗 獲得超6個贊
只需回答這個問題:您能否在這個簡單的例子中也說明RX如何解決“回調地獄問題”?
魔術是flatMap。我們可以在Rx中為@hugomg的示例編寫以下代碼:
def getData() = Observable[X]
getData().flatMap(x -> Observable[Y])
.flatMap(y -> Observable[Z])
.map(z -> ...)...
就像您正在編寫一些同步FP代碼一樣,但是實際上您可以通過使它們異步Scheduler。

TA貢獻1829條經(jīng)驗 獲得超7個贊
為了解決Rx如何解決回調地獄的問題:
首先,讓我們再次描述回調地獄。
假設有一個案例,我們必須使用http來獲取三種資源-人,星球和星系。我們的目標是找到一個人居住的星系。首先我們必須讓這個人,然后是行星,再到星系。這是三個異步操作的三個回調。
getPerson(person => {
getPlanet(person, (planet) => {
getGalaxy(planet, (galaxy) => {
console.log(galaxy);
});
});
});
每個回調都是嵌套的。每個內部回調都依賴于其父級。這導致回調地獄的“厄運金字塔”風格。該代碼看起來像一個>符號。
要在RxJs中解決此問題,您可以執(zhí)行以下操作:
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很渴望,不像可觀察對象那樣懶惰,并且(通常來說)您不能輕易取消它們。
添加回答
舉報