
31.07.2017, 16:54
|
 |
Кандидат Javascript-наук
|
|
Регистрация: 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.
|
|

01.08.2017, 09:26
|
 |
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,257
|
|
Сообщение от borus
|
Вижу, что не срабатывает ни одна из функций: done, fail, always, а только jQuery.getJSON().
|
На сервер хоть что-то приходит? Он что-то отправляет?
|
|

01.08.2017, 10:03
|
 |
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Тут правильнее задать вопрос: почему страница вообще нахрен зависла???
Цикл while (go) будет выполняться, пока go != 0. Обнулить её могут не ранее, чем в след. витке событийного цикла. А он не наступит, пока не закончится цикл while (go)
Стандартное решение - убрать цикл, каждую след. итерацию (запрос) запускать в done, строка 36
|
|

01.08.2017, 12:00
|
 |
Кандидат Javascript-наук
|
|
Регистрация: 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.
|
|

01.08.2017, 13:38
|
 |
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,257
|
|
Сообщение от borus
|
на сервер приходят данные data, и он отправляет массив
|
Тогда читай сообщение от Alexandroppolus.
Он правильно заметил неуместность твоего цикла...
Он предложил использовать для цикличности колбеки запросов. Так же можно использовать setTimeout() для повторных запросов...
Т.е. у тебя сама задумка неправильная. Бесконечный цикл вешает клиентскую машину и она уже ни на что не реагирует.
|
|

03.08.2017, 13:36
|
 |
Кандидат Javascript-наук
|
|
Регистрация: 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.
|
|

03.08.2017, 13:38
|
 |
Кандидат Javascript-наук
|
|
Регистрация: 07.12.2012
Сообщений: 147
|
|
Сообщение от ksa
|
Так же можно использовать setTimeout() для повторных запросов...
|
можно пример?
Сообщение от ksa
|
Т.е. у тебя сама задумка неправильная. Бесконечный цикл вешает клиентскую машину и она уже ни на что не реагирует.
|
как же выглядит правильный циклический ajax?
|
|

03.08.2017, 13:46
|
 |
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,257
|
|
Сообщение от borus
|
Почему не наступит? Ведь это цикл и может сложиться ситуация, по крайней мере я стремлюсь, чтобы она происходила, когда исполнение зайдет в код:
if(r.data.folder == ''){
go = 0;
}
|
Не наступит.
И твоя ситуация наглядное, тому подтверждение.
"Основной поток/скрипт" уходит в бесконечный цикл и вешает клиента. Далее он ни на что не реагирует.
|
|

03.08.2017, 13:48
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,815
|
|
borus,
var request=function(){
$.getJSON('url',{/*params*/}).always(function(){
//some code
request();
});
};
request();
|
|

03.08.2017, 13:50
|
 |
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,257
|
|
Сообщение от borus
|
можно пример?
|
Что-то типа такого...
var tmo=1000;
setTimeout(test,tmo);
function test(){
if (<проверка_условий_окончания_цикла>) {
return;
};
// Тут выполняется очередная посылка серверу
setTimeout(test,tmo);
};
|
|
|
|