RxJS方法导致callback地狱

我想在下面的用例中使用ReactiveJS Observable方法。

 IF MAIN_CACHE EXIST RETURN OUTPUT ELSE IF DB CONNECTION EXIST CACHE MAIN_CACHE (1 Hour) CACHE FALLBACK_CACHE (3 Days) RETURN OUTPUT ELSE IF FALLBACK_CACHE EXIST RETURN OUTPUT 

我得到了预期的输出,但我觉得这导致了Callback Hell ,我认为,仍然不是一个好的方法,我错过了ReactiveJS Observable关键好处。

下面是我的代码,整个代码在JS Bin Link中

 mainCache.subscribe(function (response) { console.log(response); }, function (error) { dbData.subscribe(function (response) { console.log(response); }, function (error) { console.log('DB CAL Log info', error); fallbackCache.subscribe(function (response) { console.log('FALLBACK CACHE SERVED'); console.log(response); }, function (error) { console.log('DB CAL Log error', error); }); }); }); 

任何灯光。 很高兴与工作的例子。

你的实现确实是callback地狱。 你可以通过用可用的rxjs操作符来组成你的observables来避免它,并且当你想要接收数据并且没有更多的转换时,最后订阅它。 你可以看看如何在rxjs中执行链序列 , 为什么我们需要使用flatMap? ,看看如何链接运营商,并在链接结束时只使用一个subscribe

在这里,你的链接来自捕捉错误,所以像承诺一样,最好的做法就是尽早地捕捉错误,因为你可以使用catch操作符。

 mainCache .do(console.log.bind(console)) .catch(err => dbData.catch(err => { console.log('DB CAL Log info', error); return fallbackCache.do(response => { console.log('FALLBACK CACHE SERVED'); console.log(response); }).catch(console.log.bind(console, `DB CAL Log error`)) })) 

这只是与你的使用情况相切,但是对于信息,我也包括这个链接,这个链接在丢失的情况下处理重试(例如从dbData ): retryWhen backoff