RxJS方法导致回调地狱

时间:2017-03-27 20:01:49

标签: javascript node.js promise rxjs observable

我想在下面的用例中使用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);
        });
    });
});
  

任何灯光。非常赞赏工作实例。

1 个答案:

答案 0 :(得分:4)

你的实施确实是回调地狱。您可以通过使用可用的rxjs运算符组合您的observable来避免它,并在您希望接收数据并且没有更多转换时在最后订阅。您可以查看How to do the chain sequence in rxjsWhy we need to use 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 with backoff