如何取消重试轴周期

时间:2019-12-17 15:57:44

标签: axios

如有必要,我尝试使用retry-axios在我的React应用程序中重复一些请求,但是我不知道如何拦截已经开始的重试周期。

想象一下您在某个页面上,某些内容正在加载很长的时间(具有重试功能的api调用),然后您决定离开该页面。我看到的是retry-axios重复该调用,直到调用成功或直到retry配置计数超过为止。我想以某种方式在React componentWillUnmount()中进行拦截,这可能吗?

目前,对于所有我不想重试的常规api调用,我都有PendingPromise类,并且我正在this.pendingPromises.cancelAll()生命周期方法中调用componentWillUnmount(),但是这种方法没有与retry-axios合作。

export default class PendingPromise {
  pendingPromises = []

  create(promise) {
    let hasCanceled_ = false

    const wrappedPromise = new Promise((resolve, reject) => {
      promise.then(
        val => (hasCanceled_ ? reject({ isCanceled: true }) : resolve(val)),
        error => (hasCanceled_ ? reject({ isCanceled: true }) : reject(error))
      )
    })

    const cancelablePromise = {
      promise: wrappedPromise,
      cancel() {
        hasCanceled_ = true
      }
    }

    this._appendPendingPromise(cancelablePromise)

    return cancelablePromise
  }

  _appendPendingPromise(promise) {
    this.pendingPromises = [...this.pendingPromises, promise]
  }

  remove(promise) {
    this.pendingPromises = this.pendingPromises.filter(p => p !== promise)
  }

  cancelAll() {
    this.pendingPromises.map(p => p.cancel())
  }
}

0 个答案:

没有答案