【发布时间】:2018-09-27 05:07:17
【问题描述】:
谁能建议任何从 Axios 获得响应时间的方法?我找到了 axios-timing 但我不太喜欢它(我知道有争议)。我只是想知道是否有人找到了一些记录响应时间的好方法。
【问题讨论】:
-
开发工具上的“网络”选项卡怎么样?
-
它是自动化测试的一部分,所以需要在代码中...
标签: axios
谁能建议任何从 Axios 获得响应时间的方法?我找到了 axios-timing 但我不太喜欢它(我知道有争议)。我只是想知道是否有人找到了一些记录响应时间的好方法。
【问题讨论】:
标签: axios
可以使用axios的拦截器概念。
请求拦截器将设置 startTime
axios.interceptors.request.use(function (config) {
config.metadata = { startTime: new Date()}
return config;
}, function (error) {
return Promise.reject(error);
});
响应拦截器将设置 endTime 并计算持续时间
axios.interceptors.response.use(function (response) {
response.config.metadata.endTime = new Date()
response.duration = response.config.metadata.endTime - response.config.metadata.startTime
return response;
}, function (error) {
error.config.metadata.endTime = new Date();
error.duration = error.config.metadata.endTime - error.config.metadata.startTime;
return Promise.reject(error);
});
【讨论】:
error.config 所以这个错误方面需要在设置 endTime 或 duration 之前检查if (error.config) {。
Property 'metadata' does not exist on type 'AxiosRequestConfig'.
AxiosRequestConfig 确实不存在metadata。您可以定义一个新接口来扩展 AxiosRequestConfig 并将配置转换为 (config as YourInterfaceWithMeta).metadata
过了很久,但这是我的简单解决方法
function performSearch() {
var start = Date.now();
var url='http://example.com';
var query='hello';
axios.post(url,{'par1':query})
.then(function (res) {
var millis = Date.now() - start;
$('.timer').html(""+Math.floor(millis/1000)+"s")
})
.catch(function (res) {
console.log(res)
})
}
这是我的解决方法
【讨论】:
这是我的解决方案,通过在拦截器中设置标头:
import axios from 'axios'
const url = 'https://example.com'
const instance = axios.create()
instance.interceptors.request.use((config) => {
config.headers['request-startTime'] = process.hrtime()
return config
})
instance.interceptors.response.use((response) => {
const start = response.config.headers['request-startTime']
const end = process.hrtime(start)
const milliseconds = Math.round((end[0] * 1000) + (end[1] / 1000000))
response.headers['request-duration'] = milliseconds
return response
})
instance.get(url).then((response) => {
console.log(response.headers['request-duration'])
}).catch((error) => {
console.error(`Error`)
})
【讨论】:
捎带@user3653268-我修改了他们的答案以使用react hooks并使用模数显示x.xxx秒。
import React, { useState } from 'react';
import axios from 'axios';
export default function Main() {
const [axiosTimer, setAxiosTimer] = useState('');
const handleSubmit = () => {
let startTime = Date.now();
axios.post('urlstuff')
.then(response => {
console.log('handleSubmit response: ', response);
axiosTimerFunc(startTime);
})
.catch(err => {
console.log("handleSubmit error:", err.response.data.message)
axiosTimerFunc(startTime);
setLoading(false);
});
}
const axiosTimerFunc = (startTime) => {
let now = Date.now();
let seconds = Math.floor((now - startTime)/1000);
let milliseconds = Math.floor((now - startTime)%1000);
setAxiosTimer(`${seconds}.${milliseconds} seconds`);
}
return(
<div>
<h2>Load Time: {axiosTimer}</h2>
</div>
)
}
【讨论】:
这是另一种方法:
const instance = axios.create()
instance.interceptors.request.use((config) => {
config.headers['request-startTime'] = new Date().getTime();
return config
})
instance.interceptors.response.use((response) => {
const currentTime = new Date().getTime()
const startTime = response.config.headers['request-startTime']
response.headers['request-duration'] = currentTime - startTime
return response
})
instance.get('https://example.com')
.then((response) => {
console.log(response.headers['request-duration'])
}).catch((error) => {
console.error(`Error`)
})
【讨论】:
另一种简单的方法:
axios.interceptors.response.use(
(response) => {
console.timeEnd(response.config.url);
return response;
},
(error) => {
console.timeEnd(error.response.config.url);
return Promise.reject(error);
}
);
axios.interceptors.request.use(
function (config) {
console.time(config.url );
return config;
}, function (error) {
return Promise.reject(error);
});
【讨论】:
使用异步\等待的简单方法,但不理想:
const start = Date.now()
await axios.get(url)
const finish = Date.now()
const time = (finish - start) / 1000
这将是 axios 调用的时间。不是很理想,但展示并易于实现
【讨论】:
实际上,您可以通过从 axios 请求的响应中获得的“x-response-time”标头来获取它
axios({
method: 'GET',
url: 'something.com',
})
.then((response) => {
console.log(response.headers['x-response-time']);
})
【讨论】: