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));