在错误超时之前重新发送HTTP帖子

时间:2017-11-14 17:27:43

标签: javascript angular http typescript post

我有一个Angular 4项目,它使用http post命令到我们的后端。问题在于,有时可以在后端完全启动并运行之前发送命令。通常是" ERR_CONNECTION_TIME_OUT"会发生,但我们的嵌入式浏览器出于任何原因在给我们错误(5分钟)之前保留了很长时间。由于5分钟的等待是不可接受的,如果在15-30秒内没有响应,我需要找到一种重新发送我们的http帖子的方法

以下是当前帖子的内容

this._http.post(this.sockclientURL, body, { headers: headers })
  .subscribe((res) => {

    let text = res.text();

    if (text.startsWith("ERROR")) {
      console.log("Sockclient Error.");
      if (this.sockclientErrorRetryCount < this.sockclientErrorRetryLimit) {
        console.log("Retrying in 3 seconds.");
        this.sockclientErrorRetryCount++;

        setTimeout(() => {
          this.SendCommand(command, success, fail);
        }, 3000);
      }
      return;
    }
    else {
      this.sockclientErrorRetryCount = 0;
    }

    if (text == "N" || text.startsWith("N ")) {
      this._modalService.alert(this._nackLookup.convert(text));
      if (typeof fail == 'function') {
        fail(text);
      }
    }
    else {

      let deserializedCommand = command.deserialize(text);

      success(deserializedCommand);

      let repeatMillis: number = deserializedCommand.getRepeatMillis();

      if (repeatMillis && repeatMillis > 0) {
        setTimeout(() => {
          this.SendCommand(command, success, fail);
        }, repeatMillis);
      }
    }
  },
  (err) => {
    console.log(err);
    let repeatMillis = 1000;
      setTimeout(() => {
        this.SendCommand(command, success, fail);
      }, repeatMillis);
  });

因此,为了重新限制,我有一些代码可以在发生错误时重新尝试命令,但我们的嵌入式浏览器会在几分钟内保持其超时错误。我需要一些东西试图在没有响应的15-30秒后重新发送

3 个答案:

答案 0 :(得分:1)

不是100%肯定它仍然适用于Angular4,但你能够做到:

var test = {a: {b: { c: 'value '}}}; 

var traverse = function(object){
  for (var property in object) {
    if (object.hasOwnProperty(property)) {
        console.log(property); 
        traverse(object[property])
    }else {
      console.log('None'); 
      break;
    }
  }
}
traverse(test); 

答案 1 :(得分:1)

重试立即执行,无需等待延迟。更好的一个包括在重试之前等待一段时间并在给定的时间之后中止。 Observable允许混合retryWhen,delay和timeout运算符来实现这一点,如下面的代码片段所述:

this._http.post(this.sockclientURL, body, { headers: headers })
 .retryWhen(error => error.delay(500))
 .timeout(2000, new Error('delay exceeded'))
 .map(res => res.map());

答案 2 :(得分:0)

在应用程序的整个范围内需要更多的信息,但是当我遇到这样的情况时,我通常会看到以下几种方法:

  1. try / catch会解决我的问题。     在你的捕获中,你可以重定向到其他地方。如果你什么都不抓     经常会有一点滞后。

  2. 有没有办法通过用户约束一起避免错误。

  3. 最后,您可能希望在setTimeout()上使用setInterval()。

    您能否提供有关操作范围的更多信息?