我在React-Native中有一个登录页面。如果可以连接Internet,它可以正常工作,但是现在我想处理Internet(或服务器)关闭的情况。我要执行此操作的方法是使用超时:应用程序应尝试连接,如果五秒钟内没有成功,我想打印一条错误消息。
我使用以下摘自here的代码完成了此操作:
export function timeout(
promise,
message = 'Request timeout',
timeout = DEFAULT_TIMEOUT,
) {
return new Promise((resolve, reject) => {
const timeoutId = setTimeout(() => {
console.log('timeout called');
reject(new Error(message));
}, timeout);
promise.then(
response => {
clearTimeout(timeoutId);
resolve(response);
},
err => {
console.log('timeout NOT called');
clearTimeout(timeoutId);
reject(err);
},
);
});
}
在登录页面上,我们这样称呼它:
response = await timeout(
getAccessToken(this.state.username, this.state.password),
'Unable to connect to the server.',
);
其中getAccessToken
是fetch
周围的异步包装器。第一次尝试登录(Internet断开)时,它工作正常。它等待五秒钟(DEFAULT_TIMEOUT
),然后显示“无法连接到服务器”错误消息。问题是,如果我第二次单击登录按钮,则该应用程序不会等待五秒钟,而是会显示一般的“网络错误”。我们可以在logkitty
中看到问题:
[12:08:44] I | ReactNativeJS ▶︎ timeout called (first click)
[12:08:49] I | ReactNativeJS ▶︎ timeout NOT called (second click)
我不明白为什么在第二次登录尝试时未触发超时并且timeout
自动失败。有什么问题,我该如何解决?
答案 0 :(得分:0)
Promise
返回的 fetch()
对象是rejected
。
如果在服务器端发生网络错误或CORS配置错误,则TypeError
拒绝import()约会,因此第二次尝试将识别TypeError
并立即进入拒绝状态
要再次超时,必须在连接Internet后运行fetch()
功能。然后,您必须再次关闭Internet并运行fetch()
注意:从fetch()返回的Promise对象不会拒绝HTTP 错误状态。即使HTTP状态代码返回404或500。