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