Skip to content

Latest commit

 

History

History
64 lines (46 loc) · 3.47 KB

Custom Sleep Function in JavaScript.hy.md

File metadata and controls

64 lines (46 loc) · 3.47 KB

Մի շարք հանրաճանաչ ծրագրավորման լեզուներում (օրինակ՝ Java, Python, Ruby) գոյություն ունեն կոդի կատարումը ժամանակավորապես արգելակող հատուկ ֆունկցիաներ/մեթոդներ։ (Սովորաբար այդպիսի ֆունկցիան/մեթոդը անվանում են sleep): JavaScript-ում այդպիսի ներդրված ֆունկցիա դեռևս չկա, սակայն հնարավոր է ստեղծել՝ ընդ որում բազմաթիվ տարբեր եղանակներով։

setTimeout ֆունկցիայի ուղղակի օգտագործման միջոցով հնարավոր չէ այդպիսի ֆունկցիոնալություն ապահովել, քանի֊որ այն ասինխրոն է աշխատում։ Օրինակ փորձենք կոնսոլում աշխատեցնել հետևյալ կոդը՝

console.log("start");
setTimeout(() => console.log("sleep for 3 seconds"), 3000);
console.log("continue");

Արդյունքը կլինի՝

  1. start
  2. continue
  3. 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");

Արդյունքը կլինի՝

  1. start
  2. sleep for 3 seconds
  3. 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();