Javascript 如何在rxjs ReplaySubject上使用重试

Javascript 如何在rxjs ReplaySubject上使用重试,javascript,observable,rxjs,Javascript,Observable,Rxjs,我正在创建下面的类以促进单向数据流。是否有办法使outputError方法不使可观察到的不可操作?我尝试添加subject.retry(),如下所示,但它会导致无限循环。是否可以输出错误,然后采取措施防止每次尝试重新连接时subject.retry()都收到该错误 以下是我创建的类的一部分: /** * Output data to be received by observe command of the same name * @param name The name that will

我正在创建下面的类以促进单向数据流。是否有办法使
outputError
方法不使可观察到的不可操作?我尝试添加
subject.retry()
,如下所示,但它会导致无限循环。是否可以输出错误,然后采取措施防止每次尝试重新连接时
subject.retry()
都收到该错误

以下是我创建的类的一部分:

/**
 * Output data to be received by observe command of the same name
 * @param name The name that will be listened for by observe
 * @param data An object passed to observables success handler
 */
prototype.output = function (name, data) {
    this._getReference('output', name).observer.onNext(data);
};

/**
 * Listen for an output with the given name
 * @param name The output name which is listened for
 * @returns An observable instance
 */
prototype.observe = function (name) {
    if (arguments.length > 1) throw new Error('Radio Channel: The observe method takes only one argument.');
    return this._getReference('output', name).observable;
};

/**
 * Output an error to be received by observe command
 * @param name  The name that will be listed for by observe
 * @param error An error object passed to observables error handler
 */
prototype.outputError = function(name, error) {
    this._getReference('output', name).observer.onError(error);

};

//Returns existing subject or creates a new one if it does not exist
prototype._getReference = function(type, name) {
      name = this._createName(name);
        var lookup = this['_' + type];
        var result = lookup[name];

        if (!result){
            var subject = new rx.ReplaySubject(1);
            lookup[name] = {
                observable: subject, //.retry() results in infinite loop
                observer: subject
            } ;
            result = lookup[name];
        }

        return result;
};

//Creates a consistent, non-integer key name
prototype._createName = function (name) {
    return '$' + name;
};
您可以这样使用它:

channel.observe('refresh').subscribe(onLoaded, onError);
如果不调用subject.retry(),则会调用onError函数,但不会再次调用onload。我意识到我可以将带有
error:true
的error对象输出到onload函数,但我更愿意封装更改,而不是更改类的接口,还有两个单独的处理成功和错误的功能。

操作员向受试者重新记录,希望这次不会收到onError事件。然而,当您显式地调用onError(error)时,同样的事情必须再次发生——毕竟您使用的是ReplaySubject,因此只需要重放上一个序列

“重试”用于每次运行时都具有不同输出的可观察对象

请注意,重试次数为n-1次(重试(1)根本不重试)。如果要减少重试次数,则可观察到的将失败。它现在的方式是返回“response”并成功完成

是否有可能将观测值发送到您的ReplaySubject中,并仅对subject进行concatMap以获取值

var counter = 0;
var respond = 4
var observable = Rx.Observable
    .create(observable => {
      if(counter == respond) {
        observable.onNext('response');
        observable.onCompleted();                  
      } else {
        observable.onError('error');
        counter++; 
      }
    })
    .retry(respond + 1);

observable.subscribe(value => console.log(value),
                     error => console.log(error));