在其派生链中调用一个Observable的onNext()方法

时间:2015-12-17 16:35:22

标签: javascript reactive-programming rxjs

我有一些像这样的代码:

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()方法是不好的做法吗?这是一种副作用的味道吗?如果是这样,我怎么能改进这段代码?

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的示例,您可以使用catch来处理错误。 我可能误解了你的意图,但为什么甚至会抛出错误?你不能在令牌过期时调用renewToken()并返回结果吗?