我有一些像这样的代码:
function getTokenFromStorage(cb) {
// Get token from storage
var token = getToken();
// Feed it to callback function
cb(token);
}
var subject = new Rx.BehaviorSubject(42);
var token = subject
.flatMap(function() {
return Rx.Observable.fromCallback(getTokenFromStorage)();
})
.flatMap(function(token) {
// If the token has expired, we throw it to retry handler and
// hope that it will be renewed somehow
if (isExpired(token)) {
throw 'Token has expired.';
}
return Rx.Observable.just(token);
})
.retryWhen(function(errors) {
// Get a new token and store it to the storage
renewToken();
// Restart whole chain <= QUESTION HERE
subject.onNext(42);
// Delay some time for updating item in storage
return errors.delay(1000);
})
token
.subscribe(function(r) {
// Use token to do some authorized tasks
})
我的问题是:
在自己的派生链中调用Observable的onNext()方法是不好的做法吗?这是一种副作用的味道吗?如果是这样,我怎么能改进这段代码?
提前致谢。
答案 0 :(得分:1)
如果我正确理解您的示例,您可以使用catch来处理错误。 我可能误解了你的意图,但为什么甚至会抛出错误?你不能在令牌过期时调用renewToken()并返回结果吗?