处理HTTP请求失败

时间:2016-03-24 18:15:23

标签: javascript http typescript angular

我向服务器发出http请求:

this.http.post('http://192.168.1.45:3000/testrestapi', 'user=username', {
    headers: headers
  })
  .retry(1)
  .timeout(5000)
  .map(res => res.json())
  .subscribe(data => {
    console.log('response is ready');
  }), (err) => {
    console.log('error + ', err);
  }, () => {
    console.log('Done http request');
  };

如果请求失败,我希望重试一次请求。我还希望请求在5秒后超时。我需要知道重试和超时是否都失败了所以我可以处理它。

使用上面的代码我似乎无法处理它。例如,如果请求经历了2次重试,我需要知道它已经完成,所以我可以适当地处理。我认为它会出现在“错误”部分,但控制台日志根本不会打印出来。

2 个答案:

答案 0 :(得分:1)

首先:您在括号中丢失... subscribe应用程序必须在回调后关闭:

this.http.post('http://192.168.1.45:3000/testrestapi', 'user=username', {headers: headers})
  .timeout(3000, new Error('timeout exceeded'))
  .map(res => res.json())
  .retry(1)
  .subscribe(data => {
    console.log('response is ready');
  }, (err) => {
    console.log('error + ', err);
  }, () => {
    console.log('Done http request');
  });

为防止此类错误,TSLint可能有所帮助。在这种情况下,我得到了:

  

TSLint:期望赋值或函数调用(no-unused-expression)

<强>第二retry来电必须在map来电之后。

答案 1 :(得分:1)

您可以尝试以下方法来处理重试:

this.http.post('http://192.168.1.45:3000/testrestapi', 'user=username', {
  headers: headers
})
    .retryWhen(error => error.delay(500))
    .timeout(2000, () => return new Error('delay exceeded'))
    .map(res => res.json())
    .subscribe(data => {
      console.log('response is ready');
    }, (err) => {
      console.log('error + ', err);
    }, () => {
      console.log('Done http request');
    });

没有retryWhen,立即执行重试......

有关详细信息,请参阅此链接: