在 React Redux 应用程序中使用 AbortController 中止的请求将永远中止

Posted

技术标签:

【中文标题】在 React Redux 应用程序中使用 AbortController 中止的请求将永远中止【英文标题】:Aborted request using AbortController in React Redux app is aborted forever 【发布时间】:2019-03-26 16:14:10 【问题描述】:

我有一个 fetch 服务,它向 API 发送请求(使用 Redux-thunk)。我有时想取消这些请求(通常是用户单击取消按钮)。

我在此服务中使用 AbortController,并在组件的方法中调用此控制器的 abort 方法。第一次,请求被正确中止,但是当我想再次发出这个请求时,它也会自动中止(即使 Chrome 的网络选项卡中没有请求,它也会立即拒绝)。

// fetching service
const abortController = new AbortController();
const acSignal = abortController.signal;
export  abortController ;

export default class FetchService 
    public static post(url: string): Promise<Response> 
        const requestOptions = 
            method: 'POST',
            body: ...
            signal: acSignal
        ;
        return new Promise((resolve, reject) => 
            fetch(url, requestOptions)
                .then(resolve, reject);
        );
    



// Component
import React from 'react';
import  abortController  from '../FetchService';
class Comp extends React.Component<, > 
   ...
   onCancelRequest = () => 
      // on cancel button click, abort request
      abortController.abort();
   

   onButtonClick = () => 
      // initiate request
   

onButtonClick -> 请求 -> onCancelRequest -> 请求中止 -> 再次 onButtonClick -> 请求自动中止(没有其他 onCancelRequest)

有什么提示可能是错误的吗?我只是想在它被中止后再次发出请求。

【问题讨论】:

我会切换到使用 Axios 并存储取消令牌,以便您可以在执行某个操作时取消它们。 Fetch 不允许您立即取消请求。 【参考方案1】:

我遇到了完全相同的问题,并通过在每次执行 fetch 时分配新的 AbortController 来解决它。由于我在 redux thunk 中处理 fetch 请求,因此我不完全确定您的情况的确切解决方案。但在提供的 sn-p 的上下文中,它可能看起来像这样:

// fetching service
let abortController;
export  abortController ;

export default class FetchService 
    public static post(url: string): Promise<Response> 
        abortController = new AbortController();
        const requestOptions = 
            method: 'POST',
            body: ...
            signal: abortController.signal
        ;
        return new Promise((resolve, reject) => 
            fetch(url, requestOptions)
                .then(resolve, reject);
        );
    

但是,虽然这样做可以,但我不确定这种方法是否会带来任何副作用,例如内存泄漏或悬挂的中止控制器,并且非常感谢更有经验的开发人员提供的意见。例如,有没有办法重置现有控制器而不是实例化和分配一个新控制器?

【讨论】:

以上是关于在 React Redux 应用程序中使用 AbortController 中止的请求将永远中止的主要内容,如果未能解决你的问题,请参考以下文章

Redux 使用 react-router-redux 连接“块”导航

React Native 已经有了异步存储。为啥我应该在我的 react native 应用中使用 Redux 和 Redux Thunk?

使用 redux 在 react-native 应用程序中保存访问令牌的最佳实践是啥?

如何在 React Redux 应用程序中使用装饰器?

react redux 同步调用

在 React-Redux-Router 中避免使用 Concat URL