popov654, тут очень много текста. не могли бы вы описать проблему в двух предложениях, с кодом ?)
|
Цитата:
Цитата:
Я убрал лишний текст (сорри за повтор). Код приводить вряд ли есть смысл: там ровно то, что написано выше, только ещё менее наглядно (например, потому что логических флага зачем-то сделано два). |
Вот код функции посылки запросов:
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()
}
}
|
Чёрт... Рано обрадовался. Два столбца по 29 запросов уже не тянет. А должна тянуть максимум 25 таких столбцов!
Самое обидное, что пока я не ввёл эти проверки, запросы шли быстрее раз так в пять. :( Так и знал, что линейный обход - ужасный способ. И что мне теперь делать? Может, ничего не проверяя, поставить таймаут побольше (секунд 10)? Но тогда ждать юзеру придётся даже при маленьких модификациях базы, даже когда запрос всего один :( |
вы проверяете завершенность по интервалу - ай ай ай. :nono:
function saveChanges(callback) {
var imgs = new Array(), i = 0, max = queries.length - 1;
var timer = setInterval(function(){
imgs.push(new Image);
// обработчик загрузки для последней картинки
if (i === max) imgs[i].onload = callback( imgs );
imgs[i].src = queries[i];
if( ++i > max ) clearInterval(timer);
}, 100);
}
elem.onclick = function() {
// для экономии места повторяющиеся операции занёс в функцию
function normForm() {
var a = document.form1;
a.action = 'edit.php';
a.from.value = pages * 25
a.submit();
};
if (queries.length && confirm('Вы хотите сохранить введённые данные ? ')) {
saveChanges(/*выполнится по завершении запроса*/function(a) {
// a - массив картинок.
alert('Данные сохранены! Запросов выполнено : '+a.length);
queries = [];
normForm();
});
} else {
normForm();
}
}
|
Спасибо) Не сообразил, что onload есть не только у body :)
Туплю) P.S. Там код этого обработчика несколько сложнее (потому что при нажатии на разные кнопки вызываются разные блоки), но я допилю, всё ОК :) |
Жаль, плюсик Вам в карму не отправить :)
|
Да ёлки-палки... :-E
После такой переделки у меня теперь та же ситуация, что была в самом начале: пишется, но не всё. Я изучил лог-файл сервера. В большинстве случаев не хватает одного запроса, иногда один запрос отправляется на адрес undefined. Странно... |
Ну я так и думал. Надо было поменять эти две строки местами:
if (i == max) imgs[i].onload = callback( imgs ); imgs[i].src = queries[i]; Походу до присваивания src интерпретатор считал рисунок загруженным (как раз по адресу undefined), и запускался callback, очищающий весь массив адресов запроса. В итоге запрос либо не уходил вовсе, либо уходил на адрес undefined. Настораживает ещё вот какой факт: иногда помимо запроса undefined не хватало ещё одного запроса. Поэтому вопрос к Вам: Вы уверены, что все предыдущие запросы успеют дойти? Обработчик-то мы привязали только к последнему :) |
как они могут не дойти? картинки создаются в цикле - значит запросы так же создаются в цикле. посмотрите вкладку Network в инструменте веб-мастера
|
| Часовой пояс GMT +3, время: 15:35. |