Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.07.2017, 16:54
Аватар для borus
Кандидат Javascript-наук
Отправить личное сообщение для borus Посмотреть профиль Найти все сообщения от borus
 
Регистрация: 07.12.2012
Сообщений: 147

Почему не срабатывают функции?
Здравствуйте!

Пробую отлаживать js-код, который в цикле отправляет запрос контроллеру компонента. Вижу, что не срабатывает ни одна из функций: done, fail, always, а только jQuery.getJSON(). Как понять, почему?
Сам код вот такой:
jQuery(document).ready(function (){
var time_limit = 5;//временной лимит(сек) на ответ сервера по ситуации с файлами
var i = 0;
var inc = 1;// флаг того, что нужно увеличить количество считываемых файлов: 1- увеличить на 10 шт, -1 - уменьшить на 10 шт.
var go = 1;//признак того, что нужно продолжать считывать информацию о файлах
var from = 0;
var read_cnt = 1;
while (go){
jQuery.getJSON('index.php?option=com_vm3delpics&task=fsdelete.read&format=json', {
data: {
  "time_limit":time_limit,
  "from":from, 
  "read_cnt":read_cnt 
}
})
.done(function(r) {
  if (!r.success && r.message){
    alert(r.message);
  }
  if (r.messages){
    Joomla.renderMessages(r.messages);
  }
  if (r.data){
    debugger;
    if(r.data.stop_inc == 0 ){
      read_cnt = r.data.read_cnt*2;
    }
    else{
      read_cnt = r.data.read_cnt;
    }
    $from = r.data.from;
    if(r.data.folder == ''){
      go = 0;
    }
    else{
      go = 1;
    }
  }
 })
.fail(function() {
    alert('Ошибка Ajax запроса!');
})
.always(function() {
    alert('Ajax запрос завершен');
});
}
};

Последний раз редактировалось borus, 31.07.2017 в 16:58.
Ответить с цитированием
  #2 (permalink)  
Старый 01.08.2017, 09:26
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,257

Сообщение от borus
Вижу, что не срабатывает ни одна из функций: done, fail, always, а только jQuery.getJSON().
На сервер хоть что-то приходит? Он что-то отправляет?
Ответить с цитированием
  #3 (permalink)  
Старый 01.08.2017, 10:03
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Тут правильнее задать вопрос: почему страница вообще нахрен зависла???

Цикл while (go) будет выполняться, пока go != 0. Обнулить её могут не ранее, чем в след. витке событийного цикла. А он не наступит, пока не закончится цикл while (go)

Стандартное решение - убрать цикл, каждую след. итерацию (запрос) запускать в done, строка 36
Ответить с цитированием
  #4 (permalink)  
Старый 01.08.2017, 12:00
Аватар для borus
Кандидат Javascript-наук
Отправить личное сообщение для borus Посмотреть профиль Найти все сообщения от borus
 
Регистрация: 07.12.2012
Сообщений: 147

Сообщение от ksa Посмотреть сообщение
На сервер хоть что-то приходит? Он что-то отправляет?
на сервер приходят данные data, и он отправляет массив с помощью
$result = $this->getModel('FSDelete')->select_files(JPATH_ROOT.DS.'images/stories/virtuemart/product/', $start_time, $time_limit, $from, $read_cnt);
echo new JResponseJson($result);

Вот что говорит отладка, переменная r not available:

Последний раз редактировалось borus, 01.08.2017 в 12:31.
Ответить с цитированием
  #5 (permalink)  
Старый 01.08.2017, 13:38
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,257

Сообщение от borus
на сервер приходят данные data, и он отправляет массив
Тогда читай сообщение от Alexandroppolus.
Он правильно заметил неуместность твоего цикла...

Он предложил использовать для цикличности колбеки запросов. Так же можно использовать setTimeout() для повторных запросов...

Т.е. у тебя сама задумка неправильная. Бесконечный цикл вешает клиентскую машину и она уже ни на что не реагирует.
Ответить с цитированием
  #6 (permalink)  
Старый 03.08.2017, 13:36
Аватар для borus
Кандидат Javascript-наук
Отправить личное сообщение для borus Посмотреть профиль Найти все сообщения от borus
 
Регистрация: 07.12.2012
Сообщений: 147

Сообщение от Alexandroppolus
Цикл while (go) будет выполняться, пока go != 0. Обнулить её могут не ранее, чем в след. витке событийного цикла. А он не наступит, пока не закончится цикл while (go)
Почему не наступит? Ведь это цикл и может сложиться ситуация, по крайней мере я стремлюсь, чтобы она происходила, когда исполнение зайдет в код:
if(r.data.folder == ''){
	go = 0;
}
описанный в рамках функции done()

Сообщение от Alexandroppolus
Стандартное решение - убрать цикл, каждую след. итерацию (запрос) запускать в done, строка 36
Что-то типа такого
jQuery(document).ready(function (){
...		
jQuery.getJSON('index.php?option=com_vm3delpics&task=fsdelete.read&format=json', {
			data: {
				"time_limit":time_limit,
				"from":from,
				"read_cnt":read_cnt 
			}
		})
		.done(function(r) {
			if (!r.success && r.message){
				alert(r.message);
			}
			if (r.messages){
				Joomla.renderMessages(r.messages);
			}
			if (r.data){
				debugger;
				if(r.data.stop_inc == 0 ){
					read_cnt = r.data.read_cnt*2;
				}
                                else{
                                    read_cnt = r.data.read_cnt;
                                }
				$from = r.data.from;
				if(r.data.folder != ''){
					jQuery.getJSON('index.php?option=com_vm3delpics&task=fsdelete.read&format=json', {
			                     data: {
                        				"time_limit":time_limit,
                           				"from":from,
                               				"read_cnt":read_cnt 
			                     }
                         		})

				}
			}
		})
		.fail(function() {
			alert('Ошибка Ajax запроса!');
		})
		.always(function() {
			alert('Ajax запрос завершен');
		});
});

?
Задача в цикличном считывании данных с сервера, пока не закончатся, порциями. Как тогда туда вместить новую обработку ответа с помощью функции done? Писать такие вложенные jQuery.getJSON().done().fail().always() до бесконечности?.. Ведь не будет происходить перезагрузка страницы, и вся обработка в первой done() не будет выполняться...

Попробовал тот же код запустить, просто убрав обрамление while, увидел по крайней мере ответ функций fail и always. Что же с ответом от сервера не так? Выходит php не смотря на исполняемую строку echo new JResponseJson($result); не посылает ответ? Или может ответ посылается/ловится на туда или не там?

Последний раз редактировалось borus, 03.08.2017 в 14:00.
Ответить с цитированием
  #7 (permalink)  
Старый 03.08.2017, 13:38
Аватар для borus
Кандидат Javascript-наук
Отправить личное сообщение для borus Посмотреть профиль Найти все сообщения от borus
 
Регистрация: 07.12.2012
Сообщений: 147

Сообщение от ksa
Так же можно использовать setTimeout() для повторных запросов...
можно пример?
Сообщение от ksa
Т.е. у тебя сама задумка неправильная. Бесконечный цикл вешает клиентскую машину и она уже ни на что не реагирует.
как же выглядит правильный циклический ajax?
Ответить с цитированием
  #8 (permalink)  
Старый 03.08.2017, 13:46
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,257

Сообщение от borus
Почему не наступит? Ведь это цикл и может сложиться ситуация, по крайней мере я стремлюсь, чтобы она происходила, когда исполнение зайдет в код:
if(r.data.folder == ''){
    go = 0;
}
Не наступит.
И твоя ситуация наглядное, тому подтверждение.

"Основной поток/скрипт" уходит в бесконечный цикл и вешает клиента. Далее он ни на что не реагирует.
Ответить с цитированием
  #9 (permalink)  
Старый 03.08.2017, 13:48
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,815

borus,
var request=function(){
	$.getJSON('url',{/*params*/}).always(function(){
		//some code
		request();
	});
};
request();
Ответить с цитированием
  #10 (permalink)  
Старый 03.08.2017, 13:50
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,257

Сообщение от borus
можно пример?
Что-то типа такого...

var tmo=1000;
setTimeout(test,tmo);
function test(){
	if (<проверка_условий_окончания_цикла>) {
		return;
	};
	// Тут выполняется очередная посылка серверу
	setTimeout(test,tmo);
};
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не срабатывает функция внутри функции? Conus Элементы интерфейса 1 17.04.2016 15:50
AJAX в функции dmitriyk AJAX и COMET 4 16.12.2013 12:43
пользовательские cобытия и функции jquery hurt3 jQuery 2 08.07.2013 09:13
setTimeout и setInterval срабатывают без задержки! ПОЧЕМУ? shureg Общие вопросы Javascript 1 12.05.2011 09:06
Почему так происходит. demoniqus Общие вопросы Javascript 1 27.03.2011 16:28