5

我正在使用react,reduxreact-router. 我的页面之一是发出 API 请求并显示数据。它工作正常。我想知道的是,如果 API 请求尚未完成,并且用户导航到另一条路线,我希望能够中止请求。

我假设我应该在componentWillUnmount. 只是无法理解它将如何工作。就像是...

componentWillUnmount() {
    this.props.dispatch(Actions.abortRequest());
}

我会将xhr引用存储在操作中的某处。不确定这是否是正确的方法(我认为不是),有人可以指出我正确的方向吗?

4

2 回答 2

8

我不认为xhr实际存储是正确的。
动作应该是可序列化的,而 XMLHttpRequest 绝对不是。

相反,我会使用Redux Thunk从我的动作创建者返回一个自定义对象,并执行以下操作:

function fetchPost(id) {
  return dispatch => {
    // Assuming you have a helper to make requests:
    const xhr = makePostRequest(id);

    dispatch({ type: 'FETCH_POST_REQUEST', response, id });

    // Assuming you have a helper to attach event handlers:
    trackXHR(xhr,
      (response) => dispatch({ type: 'FETCH_POST_SUCCESS', response, id }),
      (err) => dispatch({ type: 'FETCH_POST_FAILURE', err, id })
    );

    // Return an object with `abort` function to be used by component
    return { abort: () => xhr.abort() };     
  };
}

现在您可以abort从您的组件中使用:

componentDidMount() {
  this.requests = [];
  this.requests.push(
    this.props.dispatch(fetchPost(this.props.postId))
  );
}

componentWillUnmount() {
  this.requests.forEach(request => request.abort());
}
于 2015-10-03T13:23:33.427 回答
2

我认为这种方法没有任何问题。您所持有的是store全局应用程序状态;如果您想xhr根据其他操作更改行为,那么您需要将该状态存储在某处。

我见过很多商店看起来像这样的例子:

{
  isFetching: false,
  items: [],
  lastUpdated: null
};

然后该isFetching状态用于显示加载微调器或防止xhr发送多个请求。我会看到您使用和存储xhr引用并能够中止它只是此的扩展。

于 2015-10-02T07:10:01.190 回答