Вот код функции посылки запросов:
function saveChanges() {
var imgs = new Array();
for (var i = 0; i < queries.length; i++) {
imgs.push(new Image())
imgs[i].src = queries[i]
}
var tries = 0;
var timer = setInterval(function() {
tries++
requestComplete = true
for (var i = 0; i < imgs.length; i++) {
if (!imgs[i].complete) {
requestComplete = false
}
}
if (requestComplete) {
clearInterval(timer);
alert('Данные сохранены! Запросов выполнено: ' + queries.length)
queries = []
} else if (tries > 8) {
clearInterval(timer);
}
}, 100);
return false;
}
var requestComplete = false
А вот код, который выполняет ожидание перед сменой блока:
elem.onclick = function() {
if (queries.length && confirm('Вы хотите сохранить введённые данные?')) {
saveChanges()
var tries = 0;
var timer = setInterval(function() {
tries++
if (requestComplete) {
requestComplete = false
clearInterval(timer)
document.form1.action = 'edit.php'
document.form1.from.value = pages * 25
document.form1.submit()
}
if (tries > 10) {
clearInterval(timer)
alert('Ошибка запроса')
}
}, 200);
} else {
document.form1.action = 'edit.php'
document.form1.from.value = pages * 25
document.form1.submit()
}
}
Этот блок кода отвечает за переадресацию на последний блок данных, поэтому замыкания тут не используются.
Я отредактировал неудачные на мой взгляд места, это исправленная версия. Однако на длинных запросах (29 записей сразу например) почему-то вылетает алерт с неудачной отправкой (при одиночных запросах всё ОК).
Добавлено спустя 5 минут:
Всё! Работает! Я всего лишь увеличил таймауты, и этого оказалось достаточно. Вот итоговый код:
function saveChanges() {
var imgs = new Array();
for (var i = 0; i < queries.length; i++) {
imgs.push(new Image())
imgs[i].src = queries[i]
}
var tries = 0;
var timer = setInterval(function() {
tries++
requestComplete = true
for (var i = 0; i < imgs.length; i++) {
if (!imgs[i].complete) {
requestComplete = false
}
}
if (requestComplete) {
clearInterval(timer);
alert('Данные сохранены! Запросов выполнено: ' + queries.length)
queries = []
} else if (tries > 8) {
clearInterval(timer);
}
}, 500);
return false;
}
var requestComplete = false
elem.onclick = function() {
if (queries.length && confirm('Вы хотите сохранить введённые данные?')) {
saveChanges()
var tries = 0;
var timer = setInterval(function() {
tries++
if (requestComplete) {
requestComplete = false
clearInterval(timer)
document.form1.action = 'edit.php'
document.form1.from.value = pages * 25
document.form1.submit()
}
if (tries > 3) {
clearInterval(timer)
alert('Ошибка запроса')
}
}, 4000);
} else {
document.form1.action = 'edit.php'
document.form1.from.value = pages * 25
document.form1.submit()
}
}