如何从 Axios 获取响应时间



谁能建议任何从Axios获取响应时间的方法? 我发现了公理计时,但我真的不喜欢它(有争议,我知道(。 我只是想知道是否有其他人找到了记录响应时间的好方法。

您可以使用 axios 的拦截器概念。

请求拦截器将设置开始时间

axios.interceptors.request.use(function (config) {
 
  config.metadata = { startTime: new Date()}
  return config;
}, function (error) {
  return Promise.reject(error);
});

响应拦截器将设置结束时间并计算持续时间

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);
});

这是我的解决方案,通过在拦截器中设置标头:

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`)
})

这是另一种方法:

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`)
  }) 

简单的方法使用 async \ await,但不理想:

const start = Date.now()
await axios.get(url)
const finish = Date.now()
const time = (finish - start) / 1000

这将是关于公理调用的时间。不是那么理想,但显示且易于实现

搭载@user3653268 - 我修改了他们的答案以与反应钩子一起使用并使用模数显示 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>
  )
}

另一种简单的方法:

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);
});

很久以后,但这是我的简单解决方法

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)
            })

    }

这是我的解决方法

实际上你可以通过从 axios 请求的响应中获得的"x-response-time"标头来获取它

axios({
          method: 'GET',
          url: 'something.com',
        })
          .then((response) => {
            console.log(response.headers['x-response-time']);
          })

最新更新