ასინქრონული პროგრამირება
პროგრამირებაში ზოგი ოპერაცია თანმიმდევრულად ხდება, ხოლო ზოგი - პარალელურად.
რა არის სინქრონული პროგრამირება
სინქრონულ პროგრამირებაში მოისაზღება კოდის გაშვება თანმიმდევრულად. ჯერ ერთ სტრიქონში აღწერილი ოპერაციები სრულდება, შემდგომ მეორე. სანამ ბრაუზერი კონკრეტული სტრიქონის მოქმედებას არ დაამთავრებს, მანამდე არ დაიწყებს ახალი სტრიქონის განხორციელებას.
მაგალითისთვის განვიხილოთ შემდგომი კოდი:
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-ების ამუშავება და ა.შ. წარმოიდგინეთ, რამდენად არასასიამოვნო იქნება, როცა ელფოსტის აპლიკაციაში წერილს გზავნით და გაგზავნის ღილაკზე დაჭერის მერე აპლიკაცია გაიყინოს, სანამ წერილი არ გაიგზავნება!
ძირითადი ცნებები ასინქრონულ პროგრამირებაში:
- დაუბლოკავი / თავისუფალი: კოდის გაშვება შესაძლებებლია სხვადასხვა თანმიმდევრობით, ისე რომ მთავარი ნაკადი არ იყოს დაკავებული. ხშირ შემთხვევაში მომხარებლის ინტერფეისთან მუშაობის დროს, ბევრი ფრაგმენტი ერთმანეთისგან დამოუკიდებლად უნდა გაეშვას. JavaScript არის ერთ-ნაკადიანი პროგრამული ენა, თუმცა მას მაინც შეუძლია პროცესების ცალ-ცალკე გაშვება.
- Callback ფუნქციების არსებობა, რომელიც გაეშვება საჭირო დროს, როცა კონკრეტული პროცესი დაიწყება ან შესრულდება.
- Promise ობიექტები, რომლებიც წარმოადგენს ასინქრონული ოპერაციის შესაძლო შესრულებას (ან ვერ შესრულებას).
- Async/Await: სინტაქსი, რომელიც საშუალებას გვაძლევს ასინქრონული პროცესები ჩავწეროთ სინქრონულად.
ასინქრონული კოდის მაგალითი callback
-ის გამოყენებით:
console.log('დასაწყისი');
setTimeout(() => {
console.log('პროცესი შესრულდა');
}, 2000);
console.log('დასასრული');
ამ შემთხვევაში ჯერ დაილოგება დასაწყისი
შემდგომ დასასრული
და 2 წამის შემდგომ პროცესი შესრულდა
.
setTimeout
არის ფუნქცია, რომელიც მასში გადაცემულ callback
ფუნქციას გამოიძახებს მეორე არგუმენტად მიწოდებული მილისეკუნდის შემდეგ.
setTimeout
განვიხილეთ კანვასის სტატიაში.
თქვენ უკვე დაგიწერიათ ასინქრონული პროგრამა
თუ თქვენ უკვე გაეცანით და დაამუშავეთ DOM-ის თავები, ასინქრონული პროგრამები უკვე დაწერილი გექნებათ!
გახსოვთ addEventListener
ფუნქცია? ის რომ სინქრონული იყოს, ერთ ღილაკზე ამ ფუნქციის გამოყენება მთლიან აპლიკაციას გაყინავდა
და ბრაუზერი მოუცდიდა მხოლოდ ამ კონკრეტულ ღილაკზე დაკლიკების მოვლენას. მის შემდგომ დაწერილ კოდს აზრი აღარ ექნებოდა.
საბედნიეროდ, addEventListener
შეგვიძლია გავააქტიუროთ არაერთ ელემენტზე და ბრაუზერი ელემენტების მოვლენებზე ასინქრონულად ირეაგირებს!
დადებითი მხარეები ასინქრონული პროგრამირების დროს
ასინქრონული პროგრამირების დროს, თქვენი კოდი მუშაობის სისწრაფე გაუმჯობესებულია, რადგან ბევრ ოპერაციას ამუშავებთ სინქრონულად, ისე, რომ არ იბლოკება არცეთი. ეს უზრუნველყოფს უკეთეს სამომხარებლო ინტერფეისსა და სამუშაო გარემოს.
როდის უნდა გამოვიყენოთ ასინქრონული პროგრამირება ?
სერვერთან კავშირის დროს, ხშირ შემთხვევაში დაგვჭირდება ასინქრონული ოპერაციები (REST API
მოთხოვნები).
ასევე ფაილებთან მუშაობის დროს, დაგვიანებული ან განმეორებადი ოპერაციების დროს და სხვადასხვა ივენთების გაშვების დროს.
შეჯამება
სინქრონული და ასინქრონული პროგრამირების გააზრებისათვის მთავარია, კარგად გვესმოდეს თუ რა დროს რომელი გვჭირდება. შემდგომი სტატიებში განხილული იქნება ის ხელსაწყოები, რომლებიც დაგვეხმარება ასინქრონულ პროგრამირებაში: