06.12.2019, 07:07
|
Кандидат Javascript-наук
|
|
Регистрация: 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);
//-----------------------------------------------
});
}
|
|
06.12.2019, 10:02
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,588
|
|
pokk, проблема старая, известная как callback hell. Прочитайте этот раздел учебника: https://learn.javascript.ru/async , тут всё подробно расписано по этому вопросу. Скипать частями - не рекомендую, потому что одно из другого там вытекает и могут остаться проблемы с пониманием.
__________________
29375, 35
|
|
06.12.2019, 12:37
|
Кандидат Javascript-наук
|
|
Регистрация: 30.01.2014
Сообщений: 145
|
|
О благодарю много нового узнал, правильный подход это использование
asynс функций с await вместо цепочки промиксов?
|
|
06.12.2019, 13:53
|
|
Профессор
|
|
Регистрация: 08.11.2017
Сообщений: 641
|
|
Сообщение от pokk
|
О благодарю много нового узнал, правильный подход это использование asynс функций с await вместо цепочки промиксов?
|
нет, это делает код проще
clearTimeout(timerId || 0);
timerId = setTimeout(function tick() {
GetJson('GetPageVar.CGI', HandlerState);
timerId = setTimeout(tick, 1000);
}, 100);
тут написано что-то странное...
|
|
06.12.2019, 14:20
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,226
|
|
Сообщение от SuperZen
|
тут написано что-то странное...
|
Что именно там странно?
var timerId;
clearTimeout(timerId || 0);
timerId = setTimeout(function tick() {
alert('Ok');
timerId = setTimeout(tick, 1000);
}, 100);
|
|
06.12.2019, 14:49
|
|
Профессор
|
|
Регистрация: 08.11.2017
Сообщений: 641
|
|
|| 0, с таким подходом можно удалить не тот таймаут, который "в уме" подразумевается...
|
|
06.12.2019, 15:17
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,226
|
|
Сообщение от SuperZen
|
с таким подходом можно удалить не тот таймаут, который "в уме" подразумевается...
|
Это вряд ли...
В браузерах это положительное число больше 0.
Т.е. таймера с 0 не будет.
Просто чел решил сэкономить на
if (timerId) {};
Ниндзястайл и не более того...
|
|
06.12.2019, 15:24
|
|
Профессор
|
|
Регистрация: 08.11.2017
Сообщений: 641
|
|
ksa, действительно, больше нуля ... но, все равно, там должен быть setInterval вместо setTimeout...
|
|
06.12.2019, 21:59
|
|
Тлен
|
|
Регистрация: 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.
|
|
06.12.2019, 22:02
|
|
Профессор
|
|
Регистрация: 08.11.2017
Сообщений: 641
|
|
Aetae, +
|
|
|
|