web-dev-qa-db-ja.com

axiosライブラリのタイムアウト機能が機能していません

axios.defaults.timeout = 1000;を設定しました

APIを提供しているサーバーを停止しました。

ただし、リクエストを送信してからタイムアウトするまで1秒以上かかります。

これは私の要求がどのように見えるかです:

import axios from 'axios';
axios.defaults.timeout = 1000;

return axios.post(`${ROOT_URL}/login/${role}`, creds).then((response) => {
      console.log(response);

        if(response.status === 200) {
          // If login was successful, set the token in local storage
          localStorage.setItem(`${role}_log_toks`, JSON.stringify(response.data));

          // Dispatch the success action
          dispatch(receiveLogin(response.data));

          return response;
        }
      }).catch(err => {
        console.log(err);
        // If there was a problem, we want to
        // dispatch the error condition
        if(err.data && err.status === 404) {
          dispatch(loginError(err.data));
        } else {
          dispatch(loginError('Please check your network connection and try again.'));
        }

        return err;
      });

私も試しました:

return axios.post(`${ROOT_URL}/login/${role}`, creds, {timeout: 1000}).then...

Axiosはフェッチを停止せず、5〜10分後にようやくネットワークエラーを表示します。タイムアウトを処理する他の手法があることは理解していますが、axiosのタイムアウト機能が機能しないのはなぜですか? axiosがフェッチを停止しない理由は何でしょうか?

Axiosバージョン0.9.1

EDIT:コメントで述べたように、私も試しました:

import axios from 'axios';

const httpClient = axios.create();

httpClient.defaults.timeout = 500;

return httpClient.post(`${ROOT_URL}/login/${role}`, creds)
  .then(handleResponse)
19
rash.tay

Axios httpクライアントのインスタンスを作成する必要があります。

const httpClient = axios.create();
httpClient.defaults.timeout = 500;

その後、次のようにhttpClientを使用できます。

return httpClient.post(`${ROOT_URL}/login/${role}`, creds)
  .then(handleResponse)

補足として、${ROOT_URL}を使用する代わりに、同じ構成でベースURLを設定することもできます。

httpClient.defaults.baseURL = ROOT_URL
13
Clarkie

これから axios issue (ソリューションを提供してくれたzhuyifan2013に感謝)、私はaxiostimeout isresponse timeoutnot notconnection timeout

axiosを介してURLをリクエストし、サーバーが応答するのに長い時間がかかっているとしましょう。この場合、 axiosタイムアウトが機能します。

ただし、インターネットに接続していないか、要求していないIPアドレスまたはドメイン名がない場合、この場合axiosタイムアウトは機能しません。

次のコードを使用する必要があります

  let source = CancelToken.source();
  setTimeout(() => {
    source.cancel();
    // Timeout Logic
  }, 10000);

  axios.get(ip + '/config', {cancelToken: source.token}).then((result) => {
    // Handle your response
  });

接続が有効な場合でも、Timeout Logicブロックが実行されることに注意してください。

7
arthankamal

このコードは私のために機能します:

axios({
  method: "post",
  url: 'http://example.com/api',
  timeout: 1000 * 5, // Wait for 5 seconds
  headers: {
    "Content-Type": "application/json"
  },
  data: {
    id: 1234
  }
})
  .then(response => {
    const serverResponse = response.data;
    // do sth ...
  })
  .catch(error => {
    console.log(error);
});

サーバーが5秒以内に応答しない場合、catchブロックに入ります。

これも便利です: #15

6
Ali Radmanesh
submitHashtag = async () => {
  const data = await axios.post('/pwa/basics.php',  {
    withCredentials: true,// if user login
    timeout: 30000
  })
  if (!data) {
    // action here
    alert('reload window')
    return
  }
 }
0
Naved Khan