Показать сообщение отдельно
  #13 (permalink)  
Старый 03.09.2011, 05:15
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

Вот код функции посылки запросов:
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()
      }
   }

Последний раз редактировалось popov654, 03.09.2011 в 05:18.
Ответить с цитированием