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, время: 22:45. |