Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.12.2019, 07:07
Кандидат Javascript-наук
Отправить личное сообщение для pokk Посмотреть профиль Найти все сообщения от pokk
 
Регистрация: 30.01.2014
Сообщений: 145

Можно ли уменьшить код не заварачивая в функцию ?
Если объект не существует, то делаем запрос на объект и после того как ответ получен отправляем штатные функции запроса, а если же объект есть то отправляем штатные запросы. в функции GetJson последний параметр calback вызывается когда ответ принят( можно запрашивать следующий запрос)
Как бы да штатные опросы охотно завернуть в функцию, но логика т.е сразу не видно что за чем вызывается.
if(IsBookErrorNotExist()){
                    GetJson('GetBoorkError.CGI',HandlerState,function(){
                        GetJson('GetPageVar.CGI',HandlerState,function(){
                            //-----------------------------------------------
                            //-----------------------------------------------
                                setTimeout(function(){
                                    GetJson('GetSerNumber.CGI',HandlerState);
                                }, 20);
                            //-----------------------------------------------
                                clearTimeout(timerId||0);
                                timerId = setTimeout(function tick() {
                                  GetJson('GetPageVar.CGI',HandlerState);
                                  timerId = setTimeout(tick, 1000);
                                }, 100);                    
                            //-----------------------------------------------
                        });                 
                    }
                    );
                }else{
                        GetJson('GetPageVar.CGI',HandlerState,function(){
                            //-----------------------------------------------
                            //-----------------------------------------------
                                setTimeout(function(){
                                    GetJson('GetSerNumber.CGI',HandlerState);
                                }, 20);
                            //-----------------------------------------------
                                clearTimeout(timerId||0);
                                timerId = setTimeout(function tick() {
                                  GetJson('GetPageVar.CGI',HandlerState);
                                  timerId = setTimeout(tick, 1000);
                                }, 100);                    
                            //-----------------------------------------------
                        });                     
                }
Ответить с цитированием
  #2 (permalink)  
Старый 06.12.2019, 10:02
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

pokk, проблема старая, известная как callback hell. Прочитайте этот раздел учебника: https://learn.javascript.ru/async , тут всё подробно расписано по этому вопросу. Скипать частями - не рекомендую, потому что одно из другого там вытекает и могут остаться проблемы с пониманием.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 06.12.2019, 12:37
Кандидат Javascript-наук
Отправить личное сообщение для pokk Посмотреть профиль Найти все сообщения от pokk
 
Регистрация: 30.01.2014
Сообщений: 145

О благодарю много нового узнал, правильный подход это использование
asynс функций с await вместо цепочки промиксов?
Ответить с цитированием
  #4 (permalink)  
Старый 06.12.2019, 13:53
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

Сообщение от pokk Посмотреть сообщение
О благодарю много нового узнал, правильный подход это использование asynс функций с await вместо цепочки промиксов?
нет, это делает код проще

clearTimeout(timerId || 0);
timerId = setTimeout(function tick() {
  GetJson('GetPageVar.CGI', HandlerState);
  timerId = setTimeout(tick, 1000);
}, 100);

тут написано что-то странное...
Ответить с цитированием
  #5 (permalink)  
Старый 06.12.2019, 14:20
Аватар для ksa
ksa ksa на форуме
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,226

Сообщение от SuperZen
тут написано что-то странное...
Что именно там странно?
var timerId;
clearTimeout(timerId || 0);
timerId = setTimeout(function tick() {
	alert('Ok');
	timerId = setTimeout(tick, 1000);
}, 100);
Ответить с цитированием
  #6 (permalink)  
Старый 06.12.2019, 14:49
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

|| 0, с таким подходом можно удалить не тот таймаут, который "в уме" подразумевается...
Ответить с цитированием
  #7 (permalink)  
Старый 06.12.2019, 15:17
Аватар для ksa
ksa ksa на форуме
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,226

Сообщение от SuperZen
с таким подходом можно удалить не тот таймаут, который "в уме" подразумевается...
Это вряд ли...
В браузерах это положительное число больше 0.
Т.е. таймера с 0 не будет.

Просто чел решил сэкономить на
if (timerId) {};

Ниндзястайл и не более того...
Ответить с цитированием
  #8 (permalink)  
Старый 06.12.2019, 15:24
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

ksa, действительно, больше нуля ... но, все равно, там должен быть setInterval вместо setTimeout...
Ответить с цитированием
  #9 (permalink)  
Старый 06.12.2019, 21:59
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

Сообщение от pokk Посмотреть сообщение
О благодарю много нового узнал, правильный подход это использование
asynс функций с await вместо цепочки промиксов?
В принципе то да, но asynс/await пока не везде доступны, а потому если вы ещё не используете транспайлер вам придётся изучить ещё и данный вопрос. Если же обойтись без транспайлера, то цепочки промисов сами по себе достаточно наглядны и удобны.

Сообщение от ksa Посмотреть сообщение
Просто чел решил сэкономить на
if (timerId) {};
А в итоге дописал лишних 4 символа.) clearTimeout вызывается с любой чушью(приводимой к number без exception) в качестве аргумента(или вовсе без оного), по историческим причинам.

Сообщение от SuperZen Посмотреть сообщение
... но, все равно, там должен быть setInterval вместо setTimeout...
Неа, setInterval - он только для очень узких случаев.
И хотя данный конкретный код технически можно было бы заменить на setInterval, но только потому что сам код ошибочен.
Тут, как и в случае с setInterval: если GetJson займёт более 100мс, то одновременные вызовы будут накапливаться пока не станет совсем грустно. Правильный подход вызывать следующий setTimeout только после того как GetJson гарантировано отработал(в данном случае в коллбэке).
__________________
29375, 35

Последний раз редактировалось Aetae, 06.12.2019 в 22:10.
Ответить с цитированием
  #10 (permalink)  
Старый 06.12.2019, 22:02
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

Aetae, +
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли преобразовать текст строки в функцию? YISHIMITSY Общие вопросы Javascript 2 13.02.2010 12:13
Можно ли засунуть функцию PHP в JAVA? masodov Элементы интерфейса 3 03.02.2010 18:15
можно ли включить функцию в глобальную область видимости из файла maxval Элементы интерфейса 13 04.10.2009 07:11
Можно ли использовать функцию в качестве свойства свободно позиционируемого объекта Newgen Общие вопросы Javascript 0 24.07.2009 23:02
Подменю на сайте, можно ли как-нибудь упрастить код? Shanks Общие вопросы Javascript 5 16.03.2009 07:03