Bacon.retry没有重试“访问控制 - 允许 - 来源”#39;错误

时间:2015-07-02 00:21:07

标签: ajax functional-programming rxjs bacon.js

我有一个错误的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; })
           }
         })
 })

观察:

  1. 如果我向observable添加错误处理程序,它仍然无效。
  2. 由于某种原因,#retry即使成功也会被调用50次。

1 个答案:

答案 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 ,那么每次重试下游时都会收到相同的异常。