我想在下面的用例中使用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);
});
});
});
任何灯光。非常赞赏工作实例。
答案 0 :(得分:4)
你的实施确实是回调地狱。您可以通过使用可用的rxjs
运算符组合您的observable来避免它,并在您希望接收数据并且没有更多转换时在最后订阅。您可以查看How to do the chain sequence in rxjs和Why 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