我有一个错误的Web服务偶尔会发送一个500错误"XMLHttpRequest cannot load http://54.175.3.41:3124/solve. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://local.xxx.me:8080' is therefore not allowed access. The response had HTTP status code 500."
我使用Bacon.retry来包装ajax调用。当它失败时,它只会重试。但是,我注意到,当服务器出现故障时,流不会产生值。就像Bacon.retry没有重试一样(事实上,当我在开发控制台中查看时,它正在发生什么)。
我使用的是BaconJS 0.7.65。
可观察到的Bacon.retry看起来像这样:
var ajaxRequest = Bacon.fromPromise($.ajax(//...));
var observable = Bacon.retry({
source: function() { return ajaxRequest; },
retries: 50,
delay: function() { return 100; }
});
调用observable的代码如下所示:
stream.flatMap(function(valuesOrObservables) {
return Bacon.fromArray(valuesOrObservables)
.flatMapConcat(function(valueOrObservable) {
switch(valueOrObservable.type) { //we calculate this beforehand
case 'value' :
return valueOrObservable.value;
case 'observable' :
return Bacon.fromArray(valueOrObservable.observables)
.flatMapConcat(function(obs) { return obs; })
}
})
})
观察:
答案 0 :(得分:2)
我不完全确定Bacon,但是在RxJS中,Ajax调用通常包含在F_Totalamt
中,所以重新订阅错误的流只会触发同样的错误,你通常必须重新执行生成可观察对象的方法。
所以像重试一样(再次抱歉这是在Rx中):
AsyncSubject
编辑1
尝试对此进行培根,并澄清我之前的回答:
Rx.Observable.defer(() => callAjaxReturnObservable())
.retry(50)
.subscribe();
如果var observable = Bacon.retry({
source : function() { return Bacon.fromPromise($.ajax(/**/)); },
retries : 50,
delay: function() { return 100; }
});
函数中没有fromPromise
,那么每次重试下游时都会收到相同的异常。