RxJS使用ajax调用重试运算符

时间:2016-03-17 22:47:11

标签: javascript rxjs

我试图弄清楚为什么我在这个例子中使用重试不起作用:http://jsbin.com/bobecoluxu/edit?js,output

var response$ = Rx.Observable.fromPromise(
  $.ajax({
    url: 'http://en.wikipedia.org/w/api.php',
    dataType: 'jsonp',
    data: {
      action: 'opensearch',
      format: 'json',
      search: term
    }
  }))
.retry(3);

我已经在searchWikipedia函数的Observable中包装了ajax调用,但是如果我试图通过关闭wifi或者由相关运算符抛出异常来强制此调用失败,它就不会“工作。

提前致谢!

1 个答案:

答案 0 :(得分:1)

当您将承诺传递给fromPromise并呼叫重试时,它将继续发出相同的承诺(即后续的HTTP请求将被取消)。

如果您将一个返回Promise的函数传递给fromPromise,那么将重新调用该函数(允许在失败时发送后续HTTP请求)。以下示例说明了这一点:

const makesPromise = () => {
    console.log('calling');

    // Purposefully reject the Promise. You would return the return value
    // of your call to $.ajax()
    return Promise.reject();
};

const stream = Rx.Observable.fromPromise(makesPromise).retry(3);

stream.subscribe(log);

// >> calling
// >> calling
// >> calling
// Finally throws an uncaught error

注意:我必须更新到RXJS的最新4.x版本才能使用此功能