我有一个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秒后重新发送
答案 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)
在应用程序的整个范围内需要更多的信息,但是当我遇到这样的情况时,我通常会看到以下几种方法:
try / catch会解决我的问题。 在你的捕获中,你可以重定向到其他地方。如果你什么都不抓 经常会有一点滞后。
有没有办法通过用户约束一起避免错误。
最后,您可能希望在setTimeout()上使用setInterval()。
您能否提供有关操作范围的更多信息?