export function updataHeader (config: RequestConfig = {}) { const defaultOptions: CustomizeParmasTypes = { needUuid: true, needToken: true } handleCustomizeParmas(config, defaultOptions) return apiResquest.post<UserResponse>({ url: '/api/user/updataHeader', ...config }) }这段代码中...config是什么意思
时间: 2024-04-19 22:30:15 浏览: 16
在这段代码中,`...config` 表示使用对象展开运算符来将 `config` 对象的属性展开并传递给函数或方法。这样做的目的是为了方便在调用函数或方法时可以传递额外的配置参数,而不需要显式地列出每个参数。通过展开运算符,可以将 `config` 对象中的属性作为键值对传递给 `apiResquest.post` 方法,并与其他配置参数一起使用。
相关问题
import axios from 'axios' import type { CancelTokenStatic, AxiosRequestConfig, AxiosInstance, AxiosError, InternalAxiosRequestConfig, AxiosResponse, CancelTokenSource } from 'axios' import { useGlobalStore } from '@/stores' import { hasOwn, hasOwnDefault } from '@/utils' import { ElMessage } from 'element-plus' /** * @description: 请求配置 * @param {extendHeaders} {[key: string]: string} 扩展请求头用于不满足默认的 Content-Type、token 请求头的情况 * @param {ignoreLoading} boolean 是否忽略 loading 默认 false * @param {token} boolean 是否携带 token 默认 true * @param {ignoreCR} boolean 是否取消请求 默认 false * @param {ignoreCRMsg} string 取消请求的提示信息 默认 Request canceled * @param {contentType} $ContentType 重新定义 Content-Type 默认 json * @param {baseURL} $baseURL baseURL 默认 horizon * @param {timeout} number 超时时间 默认 10000 * @return {_AxiosRequestConfig} **/ interface _AxiosRequestConfig extends AxiosRequestConfig { extendHeaders?: { [key: string]: string } ignoreLoading?: boolean token?: boolean ignoreCR?: boolean ignoreCRMsg?: string } enum ContentType { html = 'text/html', text = 'text/plain', file = 'multipart/form-data', json = 'application/json', form = 'application/x-www-form-urlencoded', stream = 'application/octet-stream', } const Request: AxiosInstance = axios.create() const CancelToken: CancelTokenStatic = axios.CancelToken const source: CancelTokenSource = CancelToken.source() const globalStore = useGlobalStore() Request.interceptors.request.use( (config: InternalAxiosRequestConfig) => { globalStore.setGlobalState('loading', !hasOwnDefault(config, 'ignoreLoading', true)) config.baseURL = hasOwnDefault(config, 'baseURL', '/api') config.headers = { ...config.headers, ...{ 'Content-Type': ContentType[hasOwnDefault(config, 'Content-Type', 'json')], }, ...hasOwnDefault(config, 'extendHeaders', {}), } hasOwnDefault(config, 'token', true) && (config.headers.token = globalStore.token) config.data = config.data || {} config.params = config.params || {} config.timeout = hasOwnDefault(config, 'timeout', 10000) config.cancelToken = source.token config.withCredentials = true hasOwnDefault(config, 'ignoreCR', false) && source.cancel(hasOwnDefault(config, 'ignoreCRMsg', 'Request canceled')) return config }, (error: AxiosError) => { return Promise.reject(error) } ) Request.interceptors.response.use( (response: AxiosResponse) => { globalStore.setGlobalState('loading', false) const { data, status } = response let obj = { ...data } if (!hasOwn(data, 'status')) obj.status = status return obj }, (error: AxiosError) => { globalStore.setGlobalState('loading', false) ElMessage.error(error.message) return Promise.reject(error) } ) export default (config?: _AxiosRequestConfig) => Request(config) 修改代码,使其能够批量取消请求
可以通过创建一个 CancelToken 的数组来存储每个请求的 CancelToken,然后在需要取消请求的时候遍历这个数组并调用对应的 cancel 函数。具体的修改如下:
```
import axios, { AxiosInstance, AxiosRequestConfig, AxiosError, AxiosResponse, CancelTokenSource, Canceler } from 'axios'
import { useGlobalStore } from '@/stores'
import { hasOwn, hasOwnDefault } from '@/utils'
import { ElMessage } from 'element-plus'
interface _AxiosRequestConfig extends AxiosRequestConfig {
extendHeaders?: { [key: string]: string }
ignoreLoading?: boolean
token?: boolean
ignoreCR?: boolean
ignoreCRMsg?: string
contentType?: ContentType
baseURL?: string
timeout?: number
cancelToken?: CancelTokenSource['token'] | Canceler
}
enum ContentType {
html = 'text/html',
text = 'text/plain',
file = 'multipart/form-data',
json = 'application/json',
form = 'application/x-www-form-urlencoded',
stream = 'application/octet-stream',
}
const Request: AxiosInstance = axios.create()
const globalStore = useGlobalStore()
let cancelTokens: CancelTokenSource[] = []
Request.interceptors.request.use(
(config: _AxiosRequestConfig) => {
globalStore.setGlobalState('loading', !hasOwnDefault(config, 'ignoreLoading', true))
config.baseURL = hasOwnDefault(config, 'baseURL', '/api')
config.headers = {
...config.headers,
...{ 'Content-Type': ContentType[hasOwnDefault(config, 'contentType', 'json')] },
...hasOwnDefault(config, 'extendHeaders', {}),
}
if (hasOwnDefault(config, 'token', true)) {
config.headers.token = globalStore.token
}
config.data = config.data || {}
config.params = config.params || {}
config.timeout = hasOwnDefault(config, 'timeout', 10000)
const source = CancelToken.source()
config.cancelToken = source.token
cancelTokens.push(source)
if (hasOwnDefault(config, 'ignoreCR', false)) {
config.cancelToken = new CancelToken((cancel) => {
cancelTokens.push({ token: source.token, cancel })
})
source.cancel(hasOwnDefault(config, 'ignoreCRMsg', 'Request canceled'))
}
return config
},
(error: AxiosError) => {
return Promise.reject(error)
}
)
Request.interceptors.response.use(
(response: AxiosResponse) => {
globalStore.setGlobalState('loading', false)
const { data, status } = response
let obj = { ...data }
if (!hasOwn(data, 'status')) obj.status = status
return obj
},
(error: AxiosError) => {
globalStore.setGlobalState('loading', false)
ElMessage.error(error.message)
return Promise.reject(error)
}
)
export default (config?: _AxiosRequestConfig) => {
if (config && config.cancelToken) {
const tokens = Array.isArray(config.cancelToken) ? config.cancelToken : [config.cancelToken]
tokens.forEach((token) => {
token && typeof token === 'function' ? token() : cancelTokens.includes(token) && token.cancel()
})
}
return Request(config)
}
```
在这个修改后的代码中,我们创建了一个名为 `cancelTokens` 的数组,用于存储每个请求的 CancelToken。在请求拦截器中,我们将每个请求的 CancelToken 添加到这个数组中。在响应拦截器中,我们不需要对 `cancelTokens` 进行任何修改。
在导出的函数中,我们首先检查传入的配置对象中是否包含 `cancelToken` 属性。如果包含,我们先将其转化为数组,然后遍历数组中的每个元素,并调用对应的 `cancel` 函数进行取消。最后,我们返回一个 Promise 对象,用于异步请求。
import axios from 'axios' import type { CancelTokenStatic, AxiosRequestConfig, AxiosInstance, AxiosError, InternalAxiosRequestConfig, AxiosResponse, CancelTokenSource } from 'axios' import { useGlobalStore } from '@/stores' import { hasOwn, hasOwnDefault } from '@/utils' import { ElMessage } from 'element-plus' /** * @description: 请求配置 * @param {extendHeaders} {[key: string]: string} 扩展请求头用于不满足默认的 Content-Type、token 请求头的情况 * @param {ignoreLoading} boolean 是否忽略 loading 默认 false * @param {token} boolean 是否携带 token 默认 true * @param {ignoreCR} boolean 是否取消请求 默认 false * @param {ignoreCRMsg} string 取消请求的提示信息 默认 Request canceled * @param {contentType} $ContentType 重新定义 Content-Type 默认 json * @param {baseURL} $baseURL baseURL 默认 horizon * @param {timeout} number 超时时间 默认 10000 * @return {_AxiosRequestConfig} **/ interface _AxiosRequestConfig extends AxiosRequestConfig { extendHeaders?: { [key: string]: string } ignoreLoading?: boolean token?: boolean ignoreCR?: boolean ignoreCRMsg?: string } enum ContentType { html = 'text/html', text = 'text/plain', file = 'multipart/form-data', json = 'application/json', form = 'application/x-www-form-urlencoded', stream = 'application/octet-stream', } interface PendingRequest { url?: string cancel: () => void } const Request: AxiosInstance = axios.create() const CancelToken: CancelTokenStatic = axios.CancelToken const source: CancelTokenSource = CancelToken.source() const pendingRequests: Map<string, PendingRequest> = new Map() const globalStore = useGlobalStore() Request.interceptors.request.use( (config: InternalAxiosRequestConfig) => { globalStore.setGlobalState('loading', !hasOwnDefault(config, 'ignoreLoading', true)) config.baseURL = hasOwnDefault(config, 'baseURL', '/api') config.headers = { ...config.headers, ...{ 'Content-Type': ContentType[hasOwnDefault(config, 'Content-Type', 'json')], }, ...hasOwnDefault(config, 'extendHeaders', {}), } hasOwnDefault(config, 'token', true) && (config.headers.token = globalStore.token) config.data = config.data || {} config.params = config.params || {} config.timeout = hasOwnDefault(config, 'timeout', 10000) config.cancelToken = config.cancelToken || new CancelToken(cancel => { const url = config.url || '' if (!pendingRequests.has(url)) { pendingRequests.set(url, { cancel }) } }) hasOwnDefault(config, 'ignoreCR', false) && config.cancelToken!.promise.catch(reason => { ElMessage.warning(hasOwnDefault(config, 'ignoreCRMsg', 'Request canceled')) throw reason }) console.log(pendingRequests) return config }, (error: AxiosError) => { return Promise.reject(error) } ) Request.interceptors.response.use( (response: AxiosResponse) => { globalStore.setGlobalState('loading', false) return response.data }, (error: AxiosError) => { globalStore.setGlobalState('loading', false) const url = error.config.url || '' const pendingRequest = pendingRequests.get(url) if (pendingRequest) { pendingRequest.cancel() pendingRequests.delete(url) } ElMessage.error(error.message) return Promise.reject(error) } ) export default (config?: _AxiosRequestConfig) => Request(config) 根据代码给出例子,取消请求
可以使用 CancelToken 和 pendingRequests 来取消请求。具体的实现方式如下:
1. 在请求拦截器中,为每个请求设置一个 cancelToken,并将请求信息存储到 pendingRequests 中。
2. 在响应拦截器中,如果请求成功,将该请求从 pendingRequests 中删除。如果请求失败,取消该请求,并从 pendingRequests 中删除。
3. 如果需要取消请求,可以调用 pendingRequests 中存储的 cancel 方法。
示例代码如下:
```
import axios from 'axios';
import { CancelToken } from 'axios';
import { ElMessage } from 'element-plus';
interface PendingRequest {
url?: string;
cancel: () => void;
}
const pendingRequests: Map<string, PendingRequest> = new Map();
const request = axios.create();
request.interceptors.request.use((config) => {
// 为每个请求设置 cancelToken
config.cancelToken = new CancelToken((cancel) => {
const url = config.url || '';
if (!pendingRequests.has(url)) {
pendingRequests.set(url, { cancel });
}
});
// 其他拦截器逻辑
return config;
});
request.interceptors.response.use(
(response) => {
const url = response.config.url || '';
// 请求成功,从 pendingRequests 中删除该请求信息
pendingRequests.delete(url);
return response.data;
},
(error) => {
const url = error.config.url || '';
const pendingRequest = pendingRequests.get(url);
if (pendingRequest) {
// 取消请求,并从 pendingRequests 中删除该请求信息
pendingRequest.cancel();
pendingRequests.delete(url);
}
ElMessage.error(error.message);
return Promise.reject(error);
}
);
export function cancelRequest(url: string) {
const pendingRequest = pendingRequests.get(url);
if (pendingRequest) {
// 调用 cancel 方法取消请求
pendingRequest.cancel();
pendingRequests.delete(url);
}
}
export default request;
```
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)