Я использую следующий скрипт для проверки того, могу ли я подключаться к веб-сайту в регулярном интервале (10 секунд в моем примере кода). Я встретился с двумя проблемами, с любыми идеями, как их решить?Javascript XMLHttpRequest issue
Если веб-сайт очень медленно, и нет ответа в течение 10 секунд (что делает PingWebSite не вернуться), я нахожу 2 второй вызов PingWebSite будет выполнен из 10 второго интервала прибывает. Моя цель заключается в том, что я хочу, чтобы только один вызов PingWebSite выполнялся, и если выполняется 10-секундный интервал и выполняется предыдущий PingWebSite, я хочу предотвратить выполнение текущего PingWebSite. Есть идеи, как это решить?
Я нахожу странную проблему, когда подключаюсь к очень медленному веб-сайту, и путь кода выполняется для «alert (« connect »);», то я ожидаю, что исключение будет выбрано для таймаута, но в моей отладке , исключение не выбрасывается. Любые идеи, как поймать исключение тайм-аута?
Вот мой код,
var index = 0;
function setup() {
window.setInterval(PingWebSite, (10 * 1000));
}
function PingWebSite() {
var http_request = new XMLHttpRequest();
try {
http_request.open("GET", "http://www.google.com", true);
http_request.onreadystatechange = function() {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
MonitorInformation.innerText = "http://www.google.com" + " Connection ok";
alert("ok");
}
else {
alert("fail");
}
http_request = null;
} // if if (http_request.readyState == 4)
else {
// if execute here, no exception will be thrown
alert("connecting");
}
} // end of function
http_request.send(null);
} // try
catch (e) {
alert("service is not available");
}
}
EDIT 1: Я последовал совету здесь, чтобы изменить свой код. Вот приведенная ниже версия. Новая проблема - значение индекса (например, 0) будет выведено в поле предупреждающего сообщения перед окном сообщения об ошибке/сбое. Я думаю, что значение индекса (например, 0) должно быть предложено в окне предупреждений после сообщения об ошибке/сбое сообщения об ошибке. Любые идеи почему?
var index = 0;
var http_request;
var xhrTimeout;
var chkConn;
function setup() {
chkConn = window.setInterval(PingWebSite, (10 * 1000));
}
function WebMonitorTimeout() {
http_request.abort();
alert("timeout");
index = index + 1;
}
function PingWebSite() {
http_request = new XMLHttpRequest();
http_request.open("GET", "http://www.google.com", true);
http_request.onreadystatechange = function()
{
if (http_request.readyState == 4) {
if (chkConn) { clearInterval(chkConn); }
if (http_request.status == 200) {
alert("ok");
index = index + 1;
if (xhrTimeout) { clearTimeout(xhrTimeout); }
}
else {
alert("fail");
index = index + 1;
if (xhrTimeout) { clearTimeout(xhrTimeout); }
}
http_request = null;
} //if (http_request.readyState == 4)
} // end of event function
http_request.send(null);
xhrTimeout = setTimeout("WebMonitorTimeout();", 30000);
alert(index);
chkConn = window.setInterval(PingWebSite, (30 * 1000));
}
спасибо заранее, Джорджа
Благодаря Blixt 1. но если я не называю setInterval, как убедиться, что я пинг Интернет сайта в регулярном интервале? Мне нужно регулярно пинговать веб-сайт, а не только один раз. 2. Когда вызывается onreadystatechange? Только когда мы позвоним? – George2
1) «setTimeout» будет проверять, что функция «PingWebSite» вызывается регулярно. Он не будет вызываться ровно каждые 10 секунд, потому что это вызовет проблемы, которые у вас были. Вместо этого он будет называться через 10 секунд после завершения предыдущего запроса. Поэтому, если все запросы занимают 1 секунду, чтобы закончить в среднем, «PingWebSite» будет вызываться каждые 11 секунд в среднем. Это так, что даже если запрос занимает 20 секунд, он все равно будет ждать 10 секунд, прежде чем делать следующий запрос, вместо того, чтобы начинать два новых запроса, пока первый запрос еще не закончен. – Blixt
2) 'onreadystatechange' будет вызываться большую часть времени, хотя в случае таймаута или других сетевых проблем он может не достигнуть состояния 4. Чтобы решить эту проблему, многие фреймворки ждут определенное количество секунд, прежде чем вызывать' http_request.abort() 'и запуск ошибки« тайм-аута ». См. Источник jQuery, или пример Рамиза Уддина. – Blixt