Մի շարք հանրաճանաչ ծրագրավորման լեզուներում (օրինակ՝ Java, Python, Ruby) գոյություն ունեն կոդի կատարումը ժամանակավորապես արգելակող հատուկ ֆունկցիաներ/մեթոդներ։ (Սովորաբար այդպիսի ֆունկցիան/մեթոդը անվանում են sleep): JavaScript-ում այդպիսի ներդրված ֆունկցիա դեռևս չկա, սակայն հնարավոր է ստեղծել՝ ընդ որում բազմաթիվ տարբեր եղանակներով։
setTimeout ֆունկցիայի ուղղակի օգտագործման միջոցով հնարավոր չէ այդպիսի ֆունկցիոնալություն ապահովել, քանի֊որ այն ասինխրոն է աշխատում։ Օրինակ փորձենք կոնսոլում աշխատեցնել հետևյալ կոդը՝
console.log("start");
setTimeout(() => console.log("sleep for 3 seconds"), 3000);
console.log("continue");
Արդյունքը կլինի՝
- start
- continue
- sleep for 3 seconds // կոդի գործարկումից 3 վայրկյան հետո
Իհարկե կարելի է setTimeout ֆունկցիան «փաթեթավորել» Promise-ների մեջ, և օգտվելով ES8-ում ներդրված async await սինթաքսիսից, գրել շատ գեղեցիկ ֆունկցիա, որը կապահովեր կոդի «քնի ռեժիմը», սակայն JavaScript ծրագրավորման լեզվի գեղեցկությունը հենց նրա մեջ է, որ այն թույլ է տալիս պարզ բաներն անել պարզ կերպով։
sleep ֆունկցիան ստեղծելու համար մեզ անհրաժեշտ է օգտագործել ընդամենը Date ներդրված օբյեկտը և do while ցիկլը։ Ֆունկցիան կունենա հետևյալ տեսքը՝
function sleep(milliseconds) {
console.log(`Sleeping for ${milliseconds / 1000} seconds`);
const startDate = Date.now();
let currentDate;
do {
currentDate = Date.now();
} while (currentDate - startDate < milliseconds);
}
Այժմ փորձենք կատարել վերևում բերված օրինակը՝ այս անգամ օգտվելով մեր ստեղծած sleep ֆունկցիայից։
console.log("start");
sleep(3000);
console.log("continue");
Արդյունքը կլինի՝
- start
- sleep for 3 seconds
- continue
Ֆունկցիան լավ է աշխատում, սակայն ունի նաև թերություն։ Այն ծրագրի կատարման հոսքը կանգնեցնում է ցիկլի աշխատանքի միջոցով և երաշխավորում է, որ ոչ մի այլ տիպի փոխազդեցություն ծրագրի հետ սկզբունքորեն հնարավոր չէ։ Եթե մեզ անհրաժեշտ լինի ծրագրի կատարման շատ ավելի մեծ ընդհատում՝ բացառված չէ, որ ծրագրի կատարումը կարող է ընդհանրապես խափանվել։
Եվ ևս մի տարբերակ, այս անգամ օգտագործելով վերոհիշյալ async await սինթաքսը։
async function sleep(milliseconds) {
return new Promise((resolve) => setTimeout(resolve, milliseconds));
}
async function run() {
console.log("Starting...");
await sleep(2000); // Sleep for 2 seconds
console.log("Slept for 2 seconds");
}
run();