Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Можно ли уменьшить код не заварачивая в функцию ? (https://javascript.ru/forum/misc/79014-mozhno-li-umenshit-kod-ne-zavarachivaya-v-funkciyu.html)

pokk 06.12.2019 07:07

Можно ли уменьшить код не заварачивая в функцию ?
 
Если объект не существует, то делаем запрос на объект и после того как ответ получен отправляем штатные функции запроса, а если же объект есть то отправляем штатные запросы. в функции 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);                    
                            //-----------------------------------------------
                        });                     
                }

Aetae 06.12.2019 10:02

pokk, проблема старая, известная как callback hell. Прочитайте этот раздел учебника: https://learn.javascript.ru/async , тут всё подробно расписано по этому вопросу. Скипать частями - не рекомендую, потому что одно из другого там вытекает и могут остаться проблемы с пониманием.

pokk 06.12.2019 12:37

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

SuperZen 06.12.2019 13:53

Цитата:

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

нет, это делает код проще

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

тут написано что-то странное... ;)

ksa 06.12.2019 14:20

Цитата:

Сообщение от SuperZen
тут написано что-то странное...

Что именно там странно?
var timerId;
clearTimeout(timerId || 0);
timerId = setTimeout(function tick() {
	alert('Ok');
	timerId = setTimeout(tick, 1000);
}, 100);

SuperZen 06.12.2019 14:49

|| 0, с таким подходом можно удалить не тот таймаут, который "в уме" подразумевается...

ksa 06.12.2019 15:17

Цитата:

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

Это вряд ли... :)
В браузерах это положительное число больше 0.
Т.е. таймера с 0 не будет.

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

Ниндзястайл и не более того... :D

SuperZen 06.12.2019 15:24

ksa, действительно, больше нуля :) ... но, все равно, там должен быть setInterval вместо setTimeout...

Aetae 06.12.2019 21:59

Цитата:

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

В принципе то да, но asynс/await пока не везде доступны, а потому если вы ещё не используете транспайлер вам придётся изучить ещё и данный вопрос. Если же обойтись без транспайлера, то цепочки промисов сами по себе достаточно наглядны и удобны.

Цитата:

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

А в итоге дописал лишних 4 символа.) clearTimeout вызывается с любой чушью(приводимой к number без exception) в качестве аргумента(или вовсе без оного), по историческим причинам.

Цитата:

Сообщение от SuperZen (Сообщение 516863)
... но, все равно, там должен быть setInterval вместо setTimeout...

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

SuperZen 06.12.2019 22:02

Aetae, +


Часовой пояс GMT +3, время: 04:42.