【问题标题】:RxJS retry operator with ajax call带有ajax调用的RxJS重试运算符
【发布时间】:2016-03-17 22:47:10
【问题描述】:

我试图弄清楚为什么我在此示例中无法使用重试: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);

我已经将 ajax 调用包装在 searchWikipedia 函数中的 Observable 中,但如果我试图通过关闭 wifi 或相关操作员抛出异常来强制此调用失败,它根本不起作用。

提前致谢!

【问题讨论】:

  • 请将您的代码直接插入问题本身。链接可能会更改和过时,从而使您的问题无效。
  • @scriptHero,好的,很抱歉问题文本不便,感谢为我修复了它。

标签: javascript rxjs


【解决方案1】:

当您向fromPromise 传递一个promise 并调用retry 时,它只会继续发出相同的Promise(即不会发出后续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 版本才能使用此功能

【讨论】:

  • 另一种说法是你没有给 RxJS 一种方法来创建承诺/发出请求,所以当它重试时它不知道如何去做。相反,您已经提出了请求,并且只给了它结果(一个承诺)。这就像给一个人一条鱼和教他如何钓鱼之间的区别。如果你给了某人一条鱼,结果发现它是鱼,但你却不见踪影,他们能做的最好的就是希望你带着一条新鲜的鱼回来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 2020-12-12
  • 2017-04-28
  • 2020-11-16
  • 1970-01-01
相关资源
最近更新 更多