За разлику од других програмских језика, ЈаваСцрипт нема уграђену методу спавања. Дакле, не можете једноставно позвати функцију слееп() да паузирате Ноде.јс програм. Међутим, постоје и други начини на које можете натерати програм да чека одређено време.
Овај водич говори о три приступа: сетТимеоут, асинц/аваит и пакет за обећање спавања.
Коришћење сетТимеоут() за чекање одређеног времена
Тхе сетТимеоут() функција планира извршавање кода за време извођења након што прође одређено време. Прихвата функцију и време кашњења у милисекундама. Ево синтаксе:
сетТимеоут(функција(), тимеИнМс)
На пример, рецимо да сте имали функцију која штампа на конзоли:
функцијапринтСентенце() {
цонсоле.лог("Коришћење сетТимеоут()")
}
Да бисте покренули горњу функцију након две секунде, проследите функцију и време кашњења од 2000 мс у сетТимеоут() функција:
сетТимеоут (принтСентенце, 2000)
Иако ово функционише, није гарантовано да ће се ваша функција покренути тачно након две секунде. Дефинитивно ће бити потребно најмање толико времена, али може потрајати и више.
Да ли је сетТимеоут() тачан?
Да, али са неким упозорењима. сетТимеоут() је асинхрона ЈаваСцрипт функција што значи да не блокира. Код који планирате се додаје у петљу догађаја док се остатак вашег програма наставља.
Након што време кашњења прође, ваш програм ће извршити заказани код, али само када буде слободан да то уради. Ако је други код у стеку позива, он ће се прво извршити, чак и ако планирани код треба да се покрене. Овде може доћи до додатног времена кашњења, отуда и непрецизности.
Размотрите следећи програм.
цонсоле.лог("Здраво Свете!")
функцијапринтСентенце() {
цонсоле.лог("Коришћење сетТимеоут()")
}
сетТимеоут (принтСентенце, 2000)
цонсоле.лог("Готово")
Ево шта ће конзола приказати када је покренете:
Здраво Свете!
Готово
Коришћење сетТимеоут()
Овај програм уводи кашњење, али само одлаже код на који пролази сетТимеоут(). Остатак програма се наставља, а заказани код га прекида тек када истекне трајање. Ако желите да покренете сав овај код по реду, са паузом у средини, користите сетТимеоут() неће радити.
Једна од алтернатива је да напишете синхрони код који ће блокирати извршење онолико дуго колико вам је потребно. На пример, можете користити а уради...док петља да блокира извршну нит док не истекне време кашњења:
функцијакашњење(Госпођа) {
конст датум = Датум.Сада();
дозволити цуррентДате = нула;урадите {
цуррентДате = Датум.Сада();
} док (тренутниДатум - датум < мс);
}
цонсоле.лог("Здраво Свете");
кашњење (2000);
цонсоле.лог("Биће одштампан након 2 секунде!");
Тхе кашњење () функција петља све док тренутно време није једнако или веће од његовог времена почетка плус кашњење. Недостатак овог приступа је што је процесорски интензиван, посебно са великим кашњењима. Тхе до...вхиле петља мора да израчуна преостало време након сваке милисекунде.
Коришћење Асинц/Аваит за одлагање програма Ноде.јс
Ан чекати израз изазива паузу извршења док се обећање не реши. Омогућава вам да покренете асинхрони код као да је синхрони, али ефикасније него да ручно блокирате извршење. Можете користити само чекање унутар означене функције асинц.
функцијакашњење(време) {
повратакНоваОбећај(ресолве => сетТимеоут (ресолве, тиме));
}асинцфункцијапринтСентенце() {
цонсоле.лог("Здраво Свете")
чекати кашњење (2000);
цонсоле.лог("Биће одштампан након 2 секунде");
}
принтСентенце();
Ово је излаз горњег програма:
Здраво Свете
Биће одштампан након 2 секунде
Коришћење пакета обећање сна
Тхе сан-обећање пакет поједностављује процес паузирања Ноде.јс програма. Потребно је само да га позовете и одредите време кашњења у милисекундама.
Почните тако што ћете га инсталирати преко нпм-а:
нпм инсталирајспавати-промисе
Ево примера како бисте то могли да користите у свом програму:
конст спавати = захтевају('слееп-промисе');
(асинц () => {
цонсоле.лог("Здраво Свете.");
чекати спавати (2000);
цонсоле.лог("Биће одштампано након две секунде.");
})();
Када покренете програм, излаз ће бити следећи.
Здраво Свете.
Биће одштампано након две секунде.
Одабир одговарајућег приступа
Имплементација функције спавања у Ноде.јс може бити незгодна. Када одлучујете како да то урадите, размислите шта желите да постигнете. Ако само желите да одложите неки код, на минимално време, сетТимеоут() је добра опција. Али ако желите да паузирате извршавање целог програма, требало би да користите асинц/аваит.
Синхрони вс. Асинхроно програмирање: по чему се разликују?
Реад Нект
Повезане теме
- Програмирање
- Веб Девелопмент
- Програмирање
- ЈаваСцрипт
О аутору

Мери Гатони је програмер софтвера са страшћу за стварање техничког садржаја који није само информативан већ и привлачан. Када не кодира или пише, ужива у дружењу са пријатељима и на отвореном.
Претплатите се на наш билтен
Придружите се нашем билтену за техничке савете, рецензије, бесплатне е-књиге и ексклузивне понуде!
Кликните овде да бисте се претплатили