-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
89 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
--- | ||
title: 'ასინქრონული პროგრამირება' | ||
description: 'ასინქრწონული პროგრამირება JavaScript-ში' | ||
keywords: 'სინქრონული, ასინქრონული, async, sync, promise, callback' | ||
--- | ||
|
||
პროგრამირებაში ხშირია მომენტი, როცა გვჭირდება კოდი გაეშვას კონკრეტული თანმიმდევრობით ან კოდის გაშვების პარალელურად ვუშვებდეთ სხვადასხვა მოქმედებებს. | ||
|
||
## რა არის სინქრონული პროგრამირება | ||
|
||
სინქრონულ პროგრამირებაში მოისაზღება კოდის გაშვება ხაზობრივად. კოდი იწყებს გაშვებას ზემოდან და ნელ-ნელა მიჰყვება სხვადასხვა ხაზებს. სანამ კონკრეტული ხაზის მოქმედებას არ დაამთავრებს მანამდე არ დაიწყებს ახალი ხაზის განხილვას. | ||
|
||
მაგალითისთვის განვიხილოთ შემდგომი კოდი: | ||
|
||
```js | ||
console.log('დასაწყისი'); | ||
|
||
wait(2000); | ||
|
||
console.log('დასასრული'); | ||
|
||
function wait(ms) { | ||
const start = Date.now(); | ||
let now = start; | ||
while (now - start < ms) { | ||
now = Date.now(); | ||
} | ||
} | ||
``` | ||
|
||
არსებულ მაგალითში გვაქვს ფუნქცია `wait`, რომელიც ჩვენს კოდს სინქრონულად შეაყოვნებს გადაცემული მილიწამების მიხედვით. ჯერ კოდში დაილოგება **დასაწყისი** და 2 წამის შემდგომ დაილოგება **დასასრული**. | ||
|
||
ამრიგად სინქრონულ პროგრამირებაში კოდის ერთი ბლოკი სანამ არ დამთავრდება მანამდე არ გადაინაცვლებს შემდგომზე. | ||
|
||
ძირითადი მცნებები სინქრონული პროგრამირების: | ||
|
||
- **ბლოკზე დამოკიდებული**: ყოველი კოდის ბლოკი უცდის წინა ბლოკის დასრულებას. თუ რომელიმე კოდის ბლოკს სჭირდება დიდი დრო შესასრულებლად, მთლიანი კოდის გაშვება გადაიდება მანამ სანამ ის ბლოკი არ დასრულდება. | ||
- **პროგნოზირება**: სინქრონულ კოდში მთლიანი ნაკადი პროგნოზირებადია, რადგან ვიცით თუ რა კოდის შემდგომ რა უნდა გაეშვას. | ||
- **მარტივი შემოწმება**: რადგანაც კოდი ეშვება წრფივად (ზემოდან ქვემოთ), მისი შემოწმება (debug) საკმაოდ მარტივია. | ||
|
||
### უარყოფითი მხარეები სინქრონული პროგრამირების | ||
|
||
სინქრონული პროგრამირების დროს შესაძლებელია ხშირად წავაწყდეთ პერფორმანსის პრობლემებს, რომელიც გულისხმობს, გრძელი ოპერაციების სინქრონულად შესრულებას. ამ დროს შესაძლებელია აპლიკაცია გადავიდეს ურეაქციო მდგომარეობაში, რომელიც მომხარებლისთვის არის ძალიან ცუდი. | ||
|
||
### როდის უნდა გამოვიყენოთ სინქრონული პროგრამირება ? | ||
|
||
სინქრონული პროგრამირება გამოსადეგია მაშინ, როცა გვსურს მარტივი სკრიპტის გაშვება, სადაც არ არის ასინქრონული პროცესები გასაშვები. ამავდროულად კარგია კოდის ინიციალიზებისთვის, როცა გვსურს საწყისი მნიშვნელობების განსაზღვრა კონკრეტული state-სთვის. | ||
|
||
## რა არის ასინქრონული პროგრამირება | ||
|
||
ასინქრონული პროგრამირების დროს, შეგვიძლია სხვადასხვა პროცესები ისე გავუშვათ, რომ არ დავბლოკოთ მთავარი ნაკადი სინქრონული პროგრამირებისგან განსხვავებით. მსაგვსი მოქმედებები ხშირად არის სერვერიდან ინფორმაციის მოთხოვნა ან ჩაწერა, სხვადასხვა state-ების ამუშავება და ა.შ. | ||
|
||
ძირითადი ცნებები ასინქრონულ პროგრამირებაში: | ||
|
||
- **დაუბლოკავი / თავისუფალი**: კოდის გაშვება შესაძლებებლია სხვადასხვა თანმიმდევრობით, ისე რომ მთავარი ნაკადი არ იყოს დაკავებული. ხშირ შემთხვევაში მომხარებლის ინტერფეისთან მუშაობის დროს, ბევრი ფრაგმენეტები ერთმანეთისგან დამოუკიდებლად უნდა გაეშვას. JavaScript არის ერთ-ნაკადიანი პროგრამული ენა, თუმცა მას მაინც შეუძლია პროცესების ცალ-ცალკე გაშვება. | ||
- **Callback** ფუნქციების არსებობა, რომელიც გაეშვება საჭირო დროს, როცა კონკრეტული პროცესი დაიწყება ან შესრულდება. | ||
- **Promise** ობიექტები, რომლებიც წარმოადგენს შესაძლო შესრულებას (ან ვერ შესრულებას) ასინქრონული ოპერაციის. | ||
- **Async/Await**: სინტაქსი, რომელიც საშუალებას გვაძლევს ასინქრონული პროცესები ჩავწეროთ სინქრონულად. | ||
|
||
ასინქრონული კოდის მაგალითი `callback` გამოყენებით: | ||
|
||
```js | ||
console.log('დასაწყისი'); | ||
|
||
setTimeout(() => { | ||
console.log('პროცესი შესრულდა'); | ||
}, 2000); | ||
|
||
console.log('დასასრული'); | ||
``` | ||
|
||
ამ შემთხვევაში ჯერ დაილოგება `დასაწყისი` შემდგომ `დასასრული` და 2 წამის შემდგომ `პროცესი შესრულდა`. `setTimeout` არის ფუნქცია, რომელიც მასში გადაცემულ `callback` ფუნქციას გამოიძახებს მეორე პარამეტრის მიხედვით. [`setTimeout`](./doc/guides/javascript/canvas/basic-animations#დაგეგმილი_განახლებები) განვიხილეთ კანვასის სტატიაში. | ||
|
||
### დადებითი მხარეები ასინქრონული პროგრამირების დროს | ||
|
||
ასინქრონული პროგრამირების დროს, თქვენი კოდი მუშაობის სისწრაფე გაუმჯობესებულია, რადგან ბევრ ოპერაციას ამუშავებთ სინქრონულად, ისე რომ არ იბლოკება არცეთი. უკეთესი სამომხარებლო ინტერფეისი და სამუშაო გარემო. | ||
|
||
### როდის უნდა გამოვიყენოთ ასინქრონული პროგრამირება ? | ||
|
||
სერვერთან კავშირის დროს, ხშირ შემთხვევაში დაგვჭირდება ასინქრონული ოპერაციები ([`REST API` მოთხოვნები](./doc/guides/javascript/rest-api)). ასევე ფაილებთან მუშაობის დროს, დაგვიანებული ან განმეორებადი ოპერაციების დროს და სხვადასხვა ივენთების გაშვების დროს. | ||
|
||
## შეჯამება | ||
|
||
ხშირ შემთხვევაში ორივე მიდგომას გამოიყენებთ წერის დროს, მთავარია კარგად გვესმოდეს თუ რა დროს რომელი გვჭირდება. შემდგომი სტატიებში განხილული იქნება ის ხელსაწყოები, რომლებიც დაგვეხმარება ასინქრონული პროგრამირებისთვის: | ||
|
||
- [`Promise`](./doc/guides/javascript/async-programming/promise) | ||
- [`Async-Await`](./doc/guides/javascript/async-programming/async-await) | ||
- [`Try-Catch`](./doc/guides/javascript/async-programming/try-catch) | ||
- [შეჯამება](./doc/guides/javascript/async-programming/summary) |
Empty file.
Empty file.
Empty file.
Empty file.