第二次调用获取时没有超时

时间:2019-11-01 16:18:12

标签: javascript react-native timeout fetch-api

我在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.',
);

其中getAccessTokenfetch周围的异步包装器。第一次尝试登录(Internet断开)时,它工作正常。它等待五秒钟(DEFAULT_TIMEOUT),然后显示“无法连接到服务器”错误消息。问题是,如果我第二次单击登录按钮,则该应用程序不会等待五秒钟,而是会显示一般的“网络错误”。我们可以在logkitty中看到问题:

[12:08:44] I | ReactNativeJS ▶︎ timeout called                (first click)
[12:08:49] I | ReactNativeJS ▶︎ timeout NOT called            (second click)

我不明白为什么在第二次登录尝试时未触发超时并且timeout自动失败。有什么问题,我该如何解决?

1 个答案:

答案 0 :(得分:0)

当网络故障或请求尚未完成时,从Promise返回的

fetch()对象是rejected

如果在服务器端发生网络错误或CORS配置错误,则TypeError拒绝import()约会,因此第二次尝试将识别TypeError并立即进入拒绝状态

要再次超时,必须在连接Internet后运行fetch()功能。然后,您必须再次关闭Internet并运行fetch()

  

注意:从fetch()返回的Promise对象不会拒绝HTTP   错误状态。即使HTTP状态代码返回404或500。

相关问题