From 273658040e5fded13d5eac4540952d650c2e3b1b Mon Sep 17 00:00:00 2001 From: Kosta <68782786+KostaD02@users.noreply.github.com> Date: Sat, 20 Jul 2024 16:23:22 +0400 Subject: [PATCH] docs: async --- .../guides/javascript/async-programming.md | 89 +++++++++++++++++++ .../async-programming/async-await.md | 0 .../javascript/async-programming/promise.md | 0 .../javascript/async-programming/summary.md | 0 .../javascript/async-programming/try-catch.md | 0 5 files changed, 89 insertions(+) create mode 100644 src/content/guides/javascript/async-programming.md create mode 100644 src/content/guides/javascript/async-programming/async-await.md create mode 100644 src/content/guides/javascript/async-programming/promise.md create mode 100644 src/content/guides/javascript/async-programming/summary.md create mode 100644 src/content/guides/javascript/async-programming/try-catch.md diff --git a/src/content/guides/javascript/async-programming.md b/src/content/guides/javascript/async-programming.md new file mode 100644 index 0000000..0e00de2 --- /dev/null +++ b/src/content/guides/javascript/async-programming.md @@ -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) diff --git a/src/content/guides/javascript/async-programming/async-await.md b/src/content/guides/javascript/async-programming/async-await.md new file mode 100644 index 0000000..e69de29 diff --git a/src/content/guides/javascript/async-programming/promise.md b/src/content/guides/javascript/async-programming/promise.md new file mode 100644 index 0000000..e69de29 diff --git a/src/content/guides/javascript/async-programming/summary.md b/src/content/guides/javascript/async-programming/summary.md new file mode 100644 index 0000000..e69de29 diff --git a/src/content/guides/javascript/async-programming/try-catch.md b/src/content/guides/javascript/async-programming/try-catch.md new file mode 100644 index 0000000..e69de29