|
| 1 | +Մի շարք հանրաճանաչ ծրագրավորման լեզուներում (_օրինակ՝ Java, Python, Ruby_) գոյություն ունեն կոդի կատարումը ժամանակավորապես արգելակող հատուկ ֆունկցիաներ/մեթոդներ։ (_Սովորաբար այդպիսի ֆունկցիան/մեթոդը անվանում են sleep_): **JavaScript**-ում այդպիսի ներդրված ֆունկցիա դեռևս չկա, սակայն հնարավոր է ստեղծել՝ ընդ որում բազմաթիվ տարբեր եղանակներով։ |
| 2 | + |
| 3 | +_setTimeout_ ֆունկցիայի ուղղակի օգտագործման միջոցով հնարավոր չէ այդպիսի ֆունկցիոնալություն ապահովել, քանի֊որ այն ասինխրոն է աշխատում։ Օրինակ փորձենք կոնսոլում աշխատեցնել հետևյալ կոդը՝ |
| 4 | + |
| 5 | +```js |
| 6 | +console.log("start"); |
| 7 | +setTimeout(() => console.log("sleep for 3 seconds"), 3000); |
| 8 | +console.log("continue"); |
| 9 | +``` |
| 10 | + |
| 11 | +Արդյունքը կլինի՝ |
| 12 | + |
| 13 | +1. start |
| 14 | +2. continue |
| 15 | +3. sleep for 3 seconds // կոդի գործարկումից 3 վայրկյան հետո |
| 16 | + |
| 17 | +Իհարկե կարելի է _setTimeout_ ֆունկցիան «փաթեթավորել» _Promise_-ների մեջ, և օգտվելով _ES8_-ում ներդրված _async await_ սինթաքսիսից, գրել շատ գեղեցիկ ֆունկցիա, որը կապահովեր կոդի «քնի ռեժիմը», սակայն **JavaScript** ծրագրավորման լեզվի գեղեցկությունը հենց նրա մեջ է, որ այն թույլ է տալիս պարզ բաներն անել պարզ կերպով։ |
| 18 | + |
| 19 | +_sleep_ ֆունկցիան ստեղծելու համար մեզ անհրաժեշտ է օգտագործել ընդամենը _Date_ ներդրված օբյեկտը և _do while_ ցիկլը։ Ֆունկցիան կունենա հետևյալ տեսքը՝ |
| 20 | + |
| 21 | +```js |
| 22 | +function sleep(milliseconds) { |
| 23 | + console.log(`Sleeping for ${milliseconds / 1000} seconds`); |
| 24 | + |
| 25 | + const startDate = Date.now(); |
| 26 | + let currentDate; |
| 27 | + |
| 28 | + do { |
| 29 | + currentDate = Date.now(); |
| 30 | + } while (currentDate - startDate < milliseconds); |
| 31 | +} |
| 32 | +``` |
| 33 | + |
| 34 | +Այժմ փորձենք կատարել վերևում բերված օրինակը՝ այս անգամ օգտվելով մեր ստեղծած sleep ֆունկցիայից։ |
| 35 | + |
| 36 | +```js |
| 37 | +console.log("start"); |
| 38 | +sleep(3000); |
| 39 | +console.log("continue"); |
| 40 | +``` |
| 41 | + |
| 42 | +Արդյունքը կլինի՝ |
| 43 | + |
| 44 | +1. start |
| 45 | +2. sleep for 3 seconds |
| 46 | +3. continue |
| 47 | + |
| 48 | +Ֆունկցիան լավ է աշխատում, սակայն ունի նաև թերություն։ Այն ծրագրի կատարման հոսքը կանգնեցնում է ցիկլի աշխատանքի միջոցով և երաշխավորում է, որ ոչ մի այլ տիպի փոխազդեցություն ծրագրի հետ սկզբունքորեն հնարավոր չէ։ Եթե մեզ անհրաժեշտ լինի ծրագրի կատարման շատ ավելի մեծ ընդհատում՝ բացառված չէ, որ ծրագրի կատարումը կարող է ընդհանրապես խափանվել։ |
| 49 | + |
| 50 | +Եվ ևս մի տարբերակ, այս անգամ օգտագործելով վերոհիշյալ async await սինթաքսը։ |
| 51 | + |
| 52 | +```js |
| 53 | +async function sleep(milliseconds) { |
| 54 | + return new Promise((resolve) => setTimeout(resolve, milliseconds)); |
| 55 | +} |
| 56 | + |
| 57 | +async function run() { |
| 58 | + console.log("Starting..."); |
| 59 | + await sleep(2000); // Sleep for 2 seconds |
| 60 | + console.log("Slept for 2 seconds"); |
| 61 | +} |
| 62 | + |
| 63 | +run(); |
| 64 | +``` |
0 commit comments