我已设置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不能停止提取的原因?
修改 正如评论中所提到的,我也尝试过:
import axios from 'axios';
const httpClient = axios.create();
httpClient.defaults.timeout = 500;
return httpClient.post(`${ROOT_URL}/login/${role}`, creds)
.then(handleResponse)
答案 0 :(得分:11)
您需要创建axios http客户端的实例:
const httpClient = axios.create();
httpClient.defaults.timeout = 500;
然后您可以按如下方式使用httpClient:
return httpClient.post(`${ROOT_URL}/login/${role}`, creds)
.then(handleResponse)
另外,您也可以在同一个配置中设置基本网址,而不是使用${ROOT_URL}
:
httpClient.defaults.baseURL = ROOT_URL
答案 1 :(得分:4)
此代码对我有用:
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块。
这也很有用:#1503
答案 2 :(得分:4)
通过此axios issue(感谢 zhuyifan2013 提供解决方案),我发现 axios 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
});
请注意,如果连接有效,超时逻辑模块仍将执行。
答案 3 :(得分:0)
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
}
}
答案 4 :(得分:-2)
我在使用RN的Android上遇到了同样的问题。
我通过添加以下内容解决了该问题:
<application
...
// add this
android:usesCleartextTraffic="true">
在我的AndroidManifest.xml中
好像从Android 9一样,它阻止了不在https中的任何呼叫。
答案 5 :(得分:-3)
我在使用 React Native 时遇到了这个问题。解决办法是:
package <your package name>;
import com.facebook.react.modules.network.OkHttpClientFactory;
import com.facebook.react.modules.network.OkHttpClientProvider;
import com.facebook.react.modules.network.ReactCookieJarContainer;
import java.util.Arrays;
import okhttp3.OkHttpClient;
import okhttp3.Protocol; import java.util.concurrent.TimeUnit;
public class CustomClientFactory implements OkHttpClientFactory {
@Override
public OkHttpClient createNewNetworkModuleClient() {
return new OkHttpClient.Builder()
.connectTimeout(100000, TimeUnit.MILLISECONDS)
.readTimeout(100000, TimeUnit.MILLISECONDS)
.writeTimeout(100000, TimeUnit.MILLISECONDS)
.cookieJar(new ReactCookieJarContainer())
.protocols(Arrays.asList(Protocol.HTTP_1_1))
.build();
} }
OkHttpClientProvider.setOkHttpClientFactory(new CustomClientFactory());
您可以在以下链接中完整解释超时: