Javascript RxJS方法导致回调地狱

Javascript RxJS方法导致回调地狱,javascript,node.js,promise,rxjs,observable,Javascript,Node.js,Promise,Rxjs,Observable,我想在下面的用例中使用ReactiveJSObservable方法 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 我得到了预期的输出,但我觉得这会导致回调地狱,我认为,这仍然

我想在下面的用例中使用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
我得到了预期的输出,但我觉得这会导致
回调地狱
,我认为,这仍然不是一个好方法,而且我在ReactiveJS
可观察的
关键好处中遗漏了一些东西

下面是我的代码,整个代码都在

任何灯光。非常感谢您的工作示例


您的实现确实是一个地狱。您可以通过使用可用的
rxjs
操作符组合您的观测值来避免这种情况,并在希望接收数据且不再进行转换时在末尾订阅。您可以查看和,以了解如何链接操作符,并在链接末尾仅使用一个
subscribe

在这里,您的链接来自捕获错误,因此与promises一样,最佳实践是尽早捕获错误,正如您所做的那样,为此,您可以使用
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
):

上面只有错误用例,没有快乐路径。您可以像我的示例一样将setTimeout示例添加为jsbin或stackoverflow代码段吗。
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`))
   }))