Всем привет. Я новичок в JS, поэтому может быть я туплю в чем-то очевидном, но я этого пока не вижу.
Вот в чем дело, мне нужно получить ответы с 4 разных серверов, прежде, чем продолжать выполнение скрипта. Но синхронный запрос не подходит - если сервер упал или не отвечает, то скрипт просто повиснет, потому что синхронному нельзя поставить таймаут.
Я нашел выход в виде создания структуры данных, в которой у каждого запроса есть статус, в начале он STATUS_NONE, и принимающая callback функция начнет выполнение только тогда, когда все запросы будут без статуса STATUS_NONE.
Но приведенный ниже код почему-то не всегда срабатывает. В httpGet все функции получают тот или иной статус, но до места, где комментарий // then function code в createHtmlFromLookup почему-то не всегда доходит. Такое ощущение, что как будто бы вызов с правильными данными перебивается вызовом с данными, где еще не у всех ответов статус отличен от STATUS_NONE.
Буду благодарен, если кто-то поймет, в чем тупняк.
function httpGet(url, data, index, callback, query, options, queries, translations) {
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", url, true);
xmlHttp.onload = function (e) {
if (xmlHttp.readyState == 4) {
data[index].status = xmlHttp.status;
callback(xmlHttp.responseText, data[index]);
createHtmlFromLookup(query, options, data, queries, translations);
}
}
xmlHttp.ontimeout = function (e) {
data[index].status = xmlHttp.status;
createHtmlFromLookup(query, options, data, queries, translations);
}
xmlHttp.timeout = TIMEOUT;
xmlHttp.send(null);
}
function createHtmlFromLookup(query, options, trans_data, queries, translations) {
for (i in trans_data) {
if (trans_data[i].status == NONE_STATUS) {
return;
}
}
// then function code
}