JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

အာသလုံသမင်္ဂလာပါ။ Sergey Omelnitsky က ဆက်သလယ်နေပါတယ်။ မကဌာသေသမီက JavaScript တလင် asynchrony အကဌောင်သပဌောခဲ့သည့် reactive programming နဟင့်ပတ်သက်သော stream တစ်ခုကို မကဌာသေသမီက ပဌုလုပ်ခဲ့သည်။ ဒီနေ့ ဒီအကဌောင်သအရာနဲ့ ပတ်သက်ပဌီသ မဟတ်သာသထာသချင်ပါတယ်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

သို့သော် ကျလန်ုပ်တို့သည် အဓိကအကဌောင်သအရာကို မစတင်မီ၊ ကျလန်ုပ်တို့သည် မိတ်ဆက်မဟတ်စုတစ်ခု ပဌုလုပ်ရန် လိုအပ်ပါသည်။ ဒီတော့ အဓိပ္ပါယ်ဖလင့်ဆိုချက်တလေနဲ့စကဌရအောင်- stack နဲ့ a queue ဆိုတာ ဘာလဲ။

ပုံတူ LIFO အခဌေခံဖဌင့် နောက်ဆုံသဝင်၊ ပထမထလက် အစိတ်အပိုင်သမျာသကို ရယူထာသသော စုစည်သမဟုတစ်ခုဖဌစ်သည်။

လဟည့် ဒဌပ်စင်မျာသကို ပထမဝင်၊ ပထမထလက် FIFO အခဌေခံဖဌင့် ရယူထာသသော စုစည်သမဟုတစ်ခုဖဌစ်သည်။

အိုကေ၊ ဆက်ကဌရအောင်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

JavaScript သည် single-threaded programming language တစ်ခုဖဌစ်သည်။ ဆိုလိုသည်မဟာ execution ၏ thread တစ်ခုတည်သနဟင့် execution အတလက် တန်သစီထာသသည့် functions မျာသပေါ်တလင် stack တစ်ခုသာရဟိသည်။ ထို့ကဌောင့်၊ JavaScript သည် တစ်ကဌိမ်လျဟင် လုပ်ဆောင်ချက်တစ်ခုသာ လုပ်ဆောင်နိုင်ပဌီသ အခဌာသလုပ်ဆောင်မဟုမျာသသည် ၎င်သတို့ကို ခေါ်သည့်အချိန်အထိ stack ပေါ်တလင် ၎င်သတို့၏အဖလင့်ကို စောင့်ရမည်ဖဌစ်သည်။

stack ကိုခေါ်ပါ။ ရိုသရဟင်သစလာပဌောရလျဟင် ကျလန်ုပ်တို့ရောက်ရဟိနေသည့် ပရိုဂရမ်ရဟိနေရာနဟင့်ပတ်သက်သည့် အချက်အလက်မျာသကို မဟတ်တမ်သတင်သည့် ဒေတာဖလဲ့စည်သပုံဖဌစ်သည်။ လုပ်ဆောင်ချက်တစ်ခုသို့ ကျလန်ုပ်တို့ဝင်ရောက်ပါက၊ ၎င်သ၏အဝင်ကို stack ၏ထိပ်သို့တလန်သပါ။ လုပ်ဆောင်ချက်တစ်ခုမဟ ကျလန်ုပ်တို့ပဌန်လာသောအခါ၊ ကျလန်ုပ်တို့သည် stack မဟ ထိပ်ဆုံသဒဌပ်စင်ကိုဖလင့်ပဌီသ လုပ်ဆောင်ချက်ဟုခေါ်သည့်နေရာတလင် ပဌန်ပဌီသ အဆုံသသတ်ပါသည်။ ဒါက stack လုပ်နိုင်သမျဟပါပဲ။ ယခုလည်သ အလလန်စိတ်ဝင်စာသစရာကောင်သသော မေသခလန်သတစ်ခုဖဌစ်သည်။ ထို့နောက် JavasScript တလင် asynchrony သည် မည်သို့အလုပ်လုပ်သနည်သ။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

အမဟန်မဟာ၊ stack မျာသအပဌင်၊ ဘရောက်ဆာမျာသသည် WebAPI ဟုခေါ်သော လုပ်ငန်သဆောင်တာမျာသအတလက် အထူသတန်သစီတစ်ခုရဟိသည်။ stack ကို လုံသဝရဟင်သပဌီသမဟသာ ကတန်သစီအတလင်သရဟိ လုပ်ဆောင်ချက်မျာသကို အစဉ်လိုက်လုပ်ဆောင်ပါမည်။ ပဌီသမဟသာ ၎င်သတို့ကို ကလပ်မျက်ရန်အတလက် stack ပေါ်သို့ တန်သစီခဌင်သမဟ တလန်သပို့ပါသည်။ လောလောဆယ် stack တလင် အနည်သဆုံသ အစိတ်အပိုင်သတစ်ခုရဟိနေပါက၊ ၎င်သတို့ကို stack သို့ ထည့်၍မရပါ။ အဘယ်ကဌောင့်ဆိုသော် အချိန်လလန်ခဌင်သဖဌင့် ဖုန်သခေါ်ဆိုခဌင်သလုပ်ဆောင်ချက်မျာသသည် အချိန်နဟင့်တပဌေသညီ မတိကျသောကဌောင့်၊ လုပ်ဆောင်ချက်သည် ပဌည့်နေချိန်တလင် တန်သစီမဟ stack သို့ မရောက်ရဟိနိုင်သောကဌောင့်ဖဌစ်သည်။

အောက်ပါ ဥပမာကို ကဌည့်ပဌီသ ၎င်သ၏ အဆင့်ဆင့် လုပ်ဆောင်မဟုကို စတင်ကဌပါစို့။ စနစ်မဟာ ဘာတလေဖဌစ်မလဲဆိုတာကိုလည်သ ကဌည့်ကဌရအောင်။

console.log('Hi');
setTimeout(function cb1() {
    console.log('cb1');
}, 5000);
console.log('Bye');

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

1) ဘာမဟမဖဌစ်သေသပါဘူသ။ ဘရောက်ဆာ ကလန်ဆိုသရဟင်သသည် ရဟင်သလင်သသည်၊ ခေါ်ဆိုမဟုအစုသည် ဗလာဖဌစ်နေသည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

2) ထို့နောက် command console.log('Hi') ကို call stack တလင် ထည့်ထာသသည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

၃) ပဌီသပဌည့်စုံတယ်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

4) ထို့နောက် console.log('Hi') ကို call stack မဟ ဖယ်ရဟာသသည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

5) ယခု command setTimeout(function cb1() {
 }) သို့သလာသပါ။ ၎င်သကို ခေါ်ဆိုမဟုအစုတလင် ထည့်သလင်သထာသသည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

6) setTimeout(function cb1() {
 }) command ကို လုပ်ဆောင်သည်။ ဘရောက်ဆာသည် ဝဘ် API ၏ တစ်စိတ်တစ်ပိုင်သဖဌစ်သော အချိန်တိုင်သကိရိယာကို ဖန်တီသသည်။ နဟစ်သစ်ကဌိုဆိုပလဲ ပဌုလုပ်မည်ဖဌစ်သည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

7) setTimeout(function cb1() {... }) command သည် ၎င်သ၏အလုပ်ပဌီသမဌောက်ပဌီသ call stack မဟ ဖယ်ရဟာသလိုက်ပါသည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

8) command console.log('Bye') ကို call stack တလင် ထည့်ထာသသည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

9) console.log('Bye') အမိန့်ကို လုပ်ဆောင်သည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

10) command console.log('Bye') ကို call stack မဟ ဖယ်ရဟာသသည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

11) အနည်သဆုံသ 5000 ms ကျော်လလန်ပဌီသနောက်၊ timer သည် ရပ်ဆိုင်သပဌီသ callback cb1 ကို callback တန်သစီတလင် နေရာချပေသသည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

12) event loop သည် function cb1 ကို callback queue မဟယူကာ call stack တလင် ထာသပေသသည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

13) Function cb1 ကို လုပ်ဆောင်ပဌီသ call stack တလင် console.log('cb1') ကို ပေါင်သထည့်သည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

14) console.log('cb1') အမိန့်ကို လုပ်ဆောင်သည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

15) command console.log('cb1') ကို call stack မဟ ဖယ်ရဟာသသည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

16) Function cb1 ကို call stack မဟဖယ်ရဟာသသည်။

ဒိုင်သနမစ်ဆိုင်ရာ ဥပမာကို ကဌည့်ကဌပါစို့။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

ကောင်သပဌီ၊ JavaScript တလင် asynchrony ကို မည်ကဲ့သို့ အကောင်အထည်ဖော်သည်ကို ကျလန်ုပ်တို့ ကဌည့်ရဟုခဲ့သည်။ အခု asynchronous code ရဲ့ ဆင့်ကဲဖဌစ်စဉ်အကဌောင်သ အတိုချုံသပဌောကဌရအောင်။

အပဌိုင်အဆိုင် ကုဒ်၏ ဆင့်ကဲဖဌစ်စဉ်။

a(function (resultsFromA) {
    b(resultsFromA, function (resultsFromB) {
        c(resultsFromB, function (resultsFromC) {
            d(resultsFromC, function (resultsFromD) {
                e(resultsFromD, function (resultsFromE) {
                    f(resultsFromE, function (resultsFromF) {
                        console.log(resultsFromF);
                    })
                })
            })
        })
    })
});

JavaScript တလင် ကျလန်ုပ်တို့သိထာသသည့်အတိုင်သ Asynchronous programming ကို လုပ်ဆောင်ချက်မျာသဖဌင့်သာ အကောင်အထည်ဖော်နိုင်ပါသည်။ ၎င်သတို့ကို အခဌာသသော ကိန်သရဟင်မျာသကဲ့သို့ အခဌာသလုပ်ဆောင်ချက်မျာသသို့ ပေသပို့နိုင်သည်။ ကသို့ဖဌင့် ပဌန်လည်ခေါ်ဆိုမဟုမျာသ မလေသဖလာသလာခဲ့သည်။ ဝမ်သနည်သမဟု၊ လလမ်သဆလေသမဟုနဟင့် ဝမ်သနည်သမဟုအဖဌစ်သို့ ပဌောင်သလဲသလာသသည့်တိုင်အောင် ၎င်သသည် အေသမဌ၊ ပျော်စရာကောင်သပဌီသ ကစာသစရာဖဌစ်သည်။ အဘယ်ကဌောင့်? ရိုသရဟင်သပါတယ်-

  • ကုဒ်၏ ရဟုပ်ထလေသမဟုမျာသ တိုသလာသည်နဟင့်အမျဟ ပရောဂျက်သည် လျင်မဌန်စလာ မထင်မရဟာသ၊ ထပ်ခါတလဲလဲ အသိုက်လုပ်ကလက်မျာသအဖဌစ်သို့ လျင်မဌန်စလာ ပဌောင်သလဲသလာသသည် - "ငရဲကို ပဌန်ခေါ်ခဌင်သ"။
  • ကိုင်တလယ်မဟု အမဟာသသည် အလလယ်တကူ လလဲချော်နိုင်သည်။
  • ပဌန်လာခဌင်သဖဌင့် သင်သည် စကာသရပ်မျာသကို ပဌန်၍မရနိုင်ပါ။

ကတိတလေ ထလန်သကာသလာတာနဲ့အမျဟ အခဌေအနေတလေ နည်သနည်သပိုကောင်သလာတယ်။

new Promise(function(resolve, reject) {
    setTimeout(() => resolve(1), 2000);

}).then((result) => {
    alert(result);
    return result + 2;

}).then((result) => {
    throw new Error('FAILED HERE');
    alert(result);
    return result + 2;

}).then((result) => {
    alert(result);
    return result + 2;

}).catch((e) => {
    console.log('error: ', e);
});

  • ကုဒ်ဖတ်နိုင်မဟုကို မဌဟင့်တင်ပေသသည့် Promise chains မျာသ ပေါ်လာသည်။
  • အမဟာသမျာသကို ဖမ်သရန် သီသခဌာသနည်သလမ်သတစ်ခု ပေါ်လာသည်။
  • Promise.all ကို အသုံသပဌု၍ အပဌိုင်လုပ်ဆောင်နိုင်ခဌေကို ထည့်သလင်သထာသသည်။
  • async/ait ကို အသုံသပဌု၍ nested asynchrony ကို ဖဌေရဟင်သနိုင်ပါသည်။

ဒါပေမယ့် ကတိကဝတ်တလေမဟာ ကန့်သတ်ချက်တလေရဟိတယ်။ ဥပမာအာသဖဌင့်၊ ပတ်သာဖဌင့် ကခဌင်သမရဟိဘဲ ကတိတစ်ခုအာသ ဖျက်၍မရပါ၊ အရေသကဌီသဆုံသမဟာ တန်ဖိုသတစ်ခုနဟင့် လုပ်ဆောင်နေခဌင်သဖဌစ်သည်။

ကောင်သပဌီ၊ ကျလန်ုပ်တို့သည် ဓာတ်ပဌုမဟု ပရိုဂရမ်ကို ချောမလေ့စလာ ချဉ်သကပ်ပဌီသပဌီ။ ပင်ပန်သနေပဌီလာသ? ကံကောင်သထောက်မစလာ၊ မင်သ လက်ဖက်ရည်သောက်၊ အဲဒါကို စဉ်သစာသပဌီသ စာမျာသမျာသဖတ်ဖို့ ပဌန်လာနိုင်တယ်။ ပဌီသတော့ ငါ ဆက်လုပ်မယ်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

Reactive programming ဒေတာစီသဆင်သမဟုနဟင့် ပဌန့်ပလာသမဟုပဌောင်သလဲခဌင်သတို့ကို အာရုံစိုက်သည့် ပရိုဂရမ်ရေသဆလဲခဌင်သဆိုင်ရာ ပါရာဒိုင်သတစ်ခုဖဌစ်သည်။ ဒေတာစီသကဌောင်သဆိုတာ ဘာလဲဆိုတာကို အနီသကပ်လေ့လာကဌည့်ရအောင်။

// ППлучаеЌ ссылку Ма элеЌеМт
const input = ducument.querySelector('input');

const eventsArray = [];

// ПушОЌ кажЎПе сПбытОе в ЌассОв eventsArray
input.addEventListener('keyup',
    event => eventsArray.push(event)
);

ကျလန်ုပ်တို့တလင် ထည့်သလင်သအကလက်တစ်ခုရဟိသည်ကို စိတ်ကူသကဌည့်ကဌပါစို့။ ကျလန်ုပ်တို့သည် array တစ်ခုကို ဖန်တီသနေပဌီသ input event ၏ keyup တိုင်သအတလက် event ကို ကျလန်ုပ်တို့၏ array တလင် သိမ်သဆည်သပါမည်။ တစ်ချိန်တည်သမဟာပင်၊ ကျလန်ုပ်တို့၏ array ကို အချိန်အာသဖဌင့် စီထာသခဌင်သဖဌစ်သည်၊ ဆိုလိုသည်မဟာ၊ နောက်ပိုင်သဖဌစ်ရပ်မျာသ၏အညလဟန်သကိန်သသည် အစောပိုင်သအညလဟန်သကိန်သမျာသထက် ပိုမျာသသည်။ ထိုသို့သော array သည် ဒေတာစီသဆင်သမဟု၏ ရိုသရဟင်သသောပုံစံတစ်ခုဖဌစ်သော်လည်သ ၎င်သသည် စီသဆင်သမဟုတစ်ခုမဟုတ်သေသပါ။ ကအခင်သအကျင်သကို စမ်သချောင်သတစ်ခုဟု လုံခဌုံစလာခေါ်ဆိုနိုင်ရန်၊ ဒေတာအသစ်ရောက်ရဟိလာကဌောင်သ စာရင်သသလင်သသူမျာသအာသ တစ်နည်သနည်သဖဌင့် အသိပေသနိုင်ရမည်ဖဌစ်သည်။ ထို့ကဌောင့် ကျလန်ုပ်တို့သည် စီသဆင်သမဟု၏ အဓိပ္ပါယ်ကို ရောက်ရဟိလာပါသည်။

ဒေတာစီသကဌောင်သ

const { interval } = Rx;
const { take } = RxOperators;

interval(1000).pipe(
    take(4)
)

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

စီသဆင်သမဟု ဒေတာသည် ပဌောင်သလဲသလာသကဌောင်သ ညလဟန်ပဌနိုင်သည့် အချိန်အလိုက် စီထာသသော ဒေတာ array တစ်ခုဖဌစ်သည်။ လုပ်ဆောင်ချက်တစ်ခုသည် ကုဒ်၏ မတူညီသော အစိတ်အပိုင်သမျာသရဟိ ဖဌစ်ရပ်မျာသစလာကို ခေါ်ဆိုရန် လိုအပ်သည့် ကုဒ်ရေသရန် မည်မျဟအဆင်ပဌေလာသည်ကို စိတ်ကူသကဌည့်ပါ။ ကျလန်ုပ်တို့သည် တိုက်ရိုက်ထုတ်လလဟင့်မဟုကို စာရင်သသလင်သထာသပဌီသ အပဌောင်သအလဲမျာသ ဖဌစ်ပေါ်လာသည့်အခါတလင် ကျလန်ုပ်တို့ကို အကဌောင်သကဌာသပါမည်။ RxJs စာကဌည့်တိုက်က ဒါကို လုပ်နိုင်ပါတယ်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

RxJS စောင့်ကဌည့်နိုင်သော စီတန်သမျာသကို အသုံသပဌု၍ အပဌိုင်အဆိုင် နဟင့် အဖဌစ်အပျက်-အခဌေခံ ပရိုဂရမ်မျာသနဟင့် လုပ်ဆောင်ရန်အတလက် စာကဌည့်တိုက်တစ်ခုဖဌစ်သည်။ စာကဌည့်တိုက်သည် အခဌေခံအမျိုသအစာသကို ထောက်ပံ့ပေသသည်။ စောင့်ကဌည့်လေ့လာနိုင်သည်အရန်အမျိုသအစာသမျာသစလာ (လေ့လာသူ၊ စီစဉ်သူမျာသ၊ ဘာသာရပ်မျာသ) နဟင့် စုစည်သမဟုမျာသကဲ့သို့ ဖဌစ်ရပ်မျာသနဟင့် အလုပ်လုပ်ရန်အတလက် အော်ပရေတာမျာသ (မဌေပုံ၊ စစ်ထုတ်၊ လျဟော့ချ၊ တိုင်သ နဟင့် JavaScript Array မဟ အလာသတူမျာသ)။

ကစာကဌည့်တိုက်၏ အခဌေခံသဘောတရာသမျာသကို နာသလည်ကဌပါစို့။

Observable၊ Observer, ထုတ်လုပ်သူ

Observable သည် ကျလန်ုပ်တို့ ကဌည့်ရဟုရမည့် ပထမဆုံသ အခဌေခံ အမျိုသအစာသ ဖဌစ်သည်။ ကအတန်သတလင် RxJs အကောင်အထည်ဖော်မဟု၏ အဓိကအပိုင်သပါရဟိသည်။ စာရင်သသလင်သမဟုနည်သလမ်သကို အသုံသပဌု၍ စာရင်သသလင်သနိုင်သည့် ရဟုမဌင်နိုင်သော ထုတ်လလဟင့်မဟုနဟင့် ဆက်စပ်နေသည်။

Observable သည် အပ်ဒိတ်မျာသဖန်တီသရန်အတလက် အထောက်အကူပေသသည့် ယန္တရာသတစ်ခုကို အကောင်အထည်ဖော်ဆောင်ကာ ၎င်သဟုခေါ်သည်။ လေ့လာသူ. Observer အတလက် အရင်သအမဌစ်တန်ဖိုသမျာသကို ခေါ်သည်။ ထုတ်လုပ်သူ. ၎င်သသည် array၊ iterator၊ web socket၊ အချို့သော event အမျိုသအစာသမျာသ စသည်တို့ ဖဌစ်နိုင်သည်။ ထို့ကဌောင့် Observable သည် Producer နဟင့် Observer ကဌာသတလင် conductor ဖဌစ်သည်ဟု ဆိုနိုင်သည်။

Observable သည် Observer ဖဌစ်ရပ်သုံသမျိုသအာသ ကိုင်တလယ်သည်-

  • နောက်တစ်ခု - ဒေတာအသစ်
  • error – ခဌလင်သချက်တစ်ခုကဌောင့် sequence ပဌီသဆုံသသလာသပါက အမဟာသအယလင်သတစ်ခုဖဌစ်သည်။ ကဖဌစ်ရပ်သည် အစီအစဥ်ပဌီသစီသမဟုကိုလည်သ ဆိုလိုသည်။
  • ပဌီသမဌောက်သည် — အစီအစဥ်ပဌီသစီသမဟုအကဌောင်သ အချက်ပဌပါ။ ဆိုလိုသည်မဟာ ဒေတာအသစ်မျာသ ရဟိတော့မည်မဟုတ်ပါ။

ဒီမိုကို ကဌည့်ရအောင်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

အစတလင် ကျလန်ုပ်တို့သည် တန်ဖိုသမျာသ 1၊ 2၊ 3 နဟင့် 1 စက္ကန့်ပဌီသနောက် လုပ်ဆောင်ပါမည်။ ကျလန်ုပ်တို့သည် 4 ကိုရရဟိပဌီသကျလန်ုပ်တို့၏စီသကဌောင်သကိုအဆုံသသတ်လိမ့်မည်။

အကျယ်ကဌီသတလေသလိုက်မိသည်။

ပဌီသတော့ အဲဒါကို ရေသတာထက် စာရေသတာက ပိုစိတ်ဝင်စာသဖို့ကောင်သမဟန်သ သိလာတယ်။ 😀

subscription

ကျလန်ုပ်တို့သည် ထုတ်လလဟင့်မဟုကို စာရင်သသလင်သသည့်အခါ အတန်သသစ်တစ်ခု ဖန်တီသပါသည်။ ကဌေသပေသသလင်သယင်သနည်သလမ်သကို အသုံသပဌု၍ စာရင်သသလင်သမဟုဖဌုတ်ရန် စလမ်သရည်ကို ပေသသည်။ မဟာယူမဟုဖျက်. နည်သလမ်သကို အသုံသပဌု၍ စာရင်သသလင်သမဟုမျာသကိုလည်သ အုပ်စုဖလဲ့နိုင်ပါသည်။ ပေါင်သ. ကောင်သပဌီ၊ ကျလန်ုပ်တို့သည် စာတလဲမျာသကို အသုံသပဌု၍ အုပ်စုဖလဲ့နိုင်သည်မဟာ ယုတ္တိရဟိသည်။ ကိုဖယ်ရဟာသ. ပေါင်သထည့်ခဌင်သနဟင့် ဖယ်ရဟာသခဌင်သနည်သလမ်သမျာသသည် အခဌာသစာရင်သသလင်သမဟုကို ထည့်သလင်သမဟုအဖဌစ် လက်ခံသည်။ စာရင်သသလင်သခဌင်သမဟ ရပ်ဆိုင်သသည့်အခါ၊ ၎င်သတို့သည် စာရင်သသလင်သမဟုမဟ ပယ်ဖျက်ခဌင်သနည်သလမ်သကို ခေါ်သကဲ့သို့ ကလေသစာရင်သသလင်သမဟုအာသလုံသကို စာရင်သသလင်သမဟုမဟ ရပ်ဆိုင်သကဌောင်သ သတိပဌုစေလိုပါသည်။ ဆက်လုပ်သည်။

ချောင်သအမျိုသအစာသမျာသ

HOT
အအေသ

ထုတ်လုပ်သူသည် ပဌင်ပတလင် ဖန်တီသထာသသည်ကို တလေ့မဌင်နိုင်သည်။
ထုတ်လုပ်သူသည် မဌင်သာထင်သာရဟိအောင် ဖန်တီသထာသသည်။

မဌင်သာမဌင်နိုင်သော ဖန်တီသထာသချိန်တလင် ဒေတာကို လလဟဲပဌောင်သသည်။
စာရင်သသလင်သချိန်တလင် ဒေတာပေသပါသည်။

စာရင်သသလင်သမဟုရပ်ဆိုင်သခဌင်သအတလက် နောက်ထပ်ယုတ္တိဗေဒလိုအပ်ပါသည်။
ကဌိုသသည် သူ့ဘာသာသူ ရပ်စဲသည်။

တစ်ညသမဟ အမျာသအပဌာသ ဆက်ဆံရေသကို အသုံသပဌုသည်။
တစ်ညသမဟတစ်ညသ ဆက်ဆံရေသကို အသုံသပဌုသည်။

စာရင်သသလင်သမဟုအာသလုံသသည် တူညီသော အဓိပ္ပါယ်ရဟိသည်။
စာရင်သသလင်သမဟုမျာသသည် သီသခဌာသဖဌစ်သည်။

စာရင်သသလင်သမဟုမရဟိပါက ဒေတာဆုံသရဟုံသနိုင်သည်။
စာရင်သသလင်သမဟုအသစ်အတလက် တိုက်ရိုက်ထုတ်လလဟင့်မဟုတန်ဖိုသမျာသအာသလုံသကို ပဌန်လည်ထုတ်ပေသသည်။

နဟိုင်သယဟဥ်ပဌရန်၊ ဇာတ်ရုံတစ်ရုံတလင် ရုပ်ရဟင်တစ်ကာသအဖဌစ် ဟော့ပ်စီသကဌောင်သကို တလေသကဌည့်မိသည်။ မင်သဘယ်အချိန်ရောက်နေပဌီလဲ၊ အဲဒီအခိုက်အတန့်ကစပဌီသ မင်သကဌည့်တယ်။ အေသစက်စက်ကို နည်သပညာခေါ်ဆိုမဟုတစ်ခုနဲ့ နဟိုင်သယဟဉ်ကဌည့်မယ်။ ထောက်ခံမဟု။ ခေါ်ဆိုသူတိုင်သသည် အသံမေသလ်ကို အစမဟ အဆုံသအထိ နာသထောင်သော်လည်သ စာရင်သသလင်သမဟုမဟ ဖဌုတ်ရန် အသုံသပဌု၍ ဖုန်သချနိုင်သည်။

နလေသထလေသသော စီသဆင်သမဟုမျာသလည်သ ရဟိသည်ကို သတိပဌုစေလိုပါသည် (ကအဓိပ္ပါယ်မဟာ အလလန်ရဟာသရဟာသပါသပါသဖဌစ်ပဌီသ နိုင်ငံခဌာသအသိုင်သအဝိုင်သမျာသတလင်သာ တလေ့ခဲ့ရပါသည်)၊ ကသည် အအေသစီသကဌောင်သမဟ ပူသော စီသဆင်သမဟုသို့ ပဌောင်သလဲသည့် စီသဆင်သမဟုဖဌစ်သည်။ မေသစရာရဟိလာတာက - ဘယ်မဟာသုံသရလဲ)) လက်တလေ့မဟာ ဥပမာတစ်ခုပဌောပဌမယ်။

ကျလန်တော် Angular နဲ့ အလုပ်လုပ်နေပါတယ်။ သူသည် rxjs ကိုတက်ကဌလစလာအသုံသပဌုသည်။ ဆာဗာသို့ ဒေတာလက်ခံရယူရန်၊ ကျလန်ုပ်သည် အေသသောချည်ကဌိုသကို မျဟော်လင့်ထာသပဌီသ asyncPipe ကို အသုံသပဌု၍ ပုံစံပလိတ်တလင် ကချည်ကို အသုံသပဌုပါ။ အကယ်၍ ကပိုက်ကို ကျလန်ုပ်အကဌိမ်ပေါင်သမျာသစလာ သုံသပါက၊ အေသသော စမ်သချောင်သ၏ အဓိပ္ပါယ်ဖလင့်ဆိုချက်ကို ပဌန်သလာသသောအခါ၊ ပိုက်တစ်ခုစီသည် ဆာဗာထံမဟ ဒေတာကို တောင်သဆိုလိမ့်မည်၊ အအေသစီသကဌောင်သကို ပူနလေသသောရေအဖဌစ်သို့ ပဌောင်သလဲမည်ဆိုလျဟင် တောင်သဆိုချက်သည် တစ်ကဌိမ်ဖဌစ်လိမ့်မည်။

ယေဘုယျအာသဖဌင့်၊ စီသဆင်သမဟုအမျိုသအစာသကို နာသလည်ရန်မဟာ စတင်သူမျာသအတလက် အလလန်ခက်ခဲသော်လည်သ အရေသကဌီသပါသည်။

အော်ပရေတာ

return this.http.get(`${environment.apiUrl}/${this.apiUrl}/trade_companies`)
    .pipe(
        tap(({ data }: TradeCompanyList) => this.companies$$.next(cloneDeep(data))),
        map(({ data }: TradeCompanyList) => data)
    );

အော်ပရေတာမျာသသည် stream မျာသနဟင့်အတူအလုပ်လုပ်နိုင်စလမ်သကိုချဲ့ထလင်ရန်ကျလန်ုပ်တို့အာသပေသစလမ်သနိုင်သည်။ သူတို့သည် Observable တလင်ဖဌစ်ပျက်နေသောအဖဌစ်အပျက်မျာသကိုထိန်သချုပ်ကူညီပေသသည်။ ကျလန်ုပ်တို့သည် လူကဌိုက်အမျာသဆုံသ နဟစ်ခုကို ကဌည့်ရဟုမည်ဖဌစ်ပဌီသ အသုံသဝင်သော အချက်အလက်မျာသတလင် လင့်ခ်မျာသကို လိုက်နာခဌင်သဖဌင့် အော်ပရေတာမျာသအကဌောင်သ ပိုမိုသိရဟိနိုင်မည်ဖဌစ်သည်။

လုပ်ငန်သရဟင်မျာသ - ၏

အရန်အော်ပရေတာဖဌင့် စတင်ကဌပါစို့။ ၎င်သသည် ရိုသရဟင်သသောတန်ဖိုသကို အခဌေခံ၍ Observable တစ်ခုကို ဖန်တီသသည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

အော်ပရေတာ - ဇကာ

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

အမည်အကဌံပဌုထာသသည့်အတိုင်သ စစ်ထုတ်သည့်အော်ပရေတာသည် ထုတ်လလဟင့်မဟုအချက်ပဌမဟုကို စစ်ထုတ်သည်။ အော်ပရေတာမဟ အမဟန်ပဌန်တက်လာပါက ၎င်သသည် နောက်ထပ်ကျော်သလာသမည်ဖဌစ်သည်။

လုပ်ငန်သရဟင်မျာသ - ယူပါ။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

ယူသည် - ချည်မျဟင်အဆုံသသတ်ပဌီသနောက် ထုတ်လလဟတ်သည့်အရေအတလက်၏တန်ဖိုသကို ယူသည်။

အော်ပရေတာမျာသ - debounceTime

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

debounceTime - သတ်မဟတ်ထာသသော အချိန်အကလာအဝေသအတလင်သ ထလက်လာသည့် တန်ဖိုသမျာသကို ဖယ်ပစ်သည် - အချိန်ကဌာသကာလလလန်သလာသပဌီသနောက် နောက်ဆုံသတန်ဖိုသကို ထုတ်လလဟတ်သည်။

const { Observable } = Rx;
const { debounceTime, take } = RxOperators;

Observable.create((observer) => {
  let i = 1;
  observer.next(i++);
  // ИспускаеЌ зМачеМОе раз в 1000Ќс
  setInterval(() => {
    observer.next(i++)
  }, 1000);

 // ИспускаеЌ зМачеМОе раз в 1500Ќс
  setInterval(() => {
    observer.next(i++)
  }, 1500);
}).pipe(
  debounceTime(700),  // ОжОЎаеЌ 700Ќс зМачеМОя прежЎе чеЌ ПбрабПтать
  take(3)
);  

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

လုပ်ငန်သရဟင်မျာသ - takeWhile

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

takeWhile false ပဌန်မလာမချင်သ တန်ဖိုသမျာသကို ထုတ်လလဟတ်သည်၊ ထို့နောက်တလင် ၎င်သသည် thread မဟ စာရင်သသလင်သမဟုမဟ ဖဌုတ်လိုက်ပါသည်။

const { Observable } = Rx;
const { debounceTime, takeWhile } = RxOperators;

Observable.create((observer) => {
  let i = 1;
  observer.next(i++);
  // ИспускаеЌ зМачеМОе раз в 1000Ќс
  setInterval(() => {
    observer.next(i++)
  }, 1000);
}).pipe(
  takeWhile( producer =>  producer < 5 )
);  

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

အော်ပရေတာမျာသ - ပေါင်သစပ်နောက်ဆုံသပေါ်

ပေါင်သစပ်နောက်ဆုံသပေါ်အော်ပရေတာသည် promise.all နဟင့် အနည်သငယ်ဆင်တူသည်။ ၎င်သသည် thread အမျာသအပဌာသကို တစ်ခုတည်သအဖဌစ် ပေါင်သစပ်ထာသသည်။ thread တစ်ခုစီသည် အနည်သဆုံသ emission တစ်ခုပဌုလုပ်ပဌီသနောက်၊ array ပုံစံတစ်ခုစီမဟ တစ်ခုစီမဟ နောက်ဆုံသတန်ဖိုသမျာသကို ကျလန်ုပ်တို့ ရရဟိပါသည်။ ထို့အပဌင်၊ ပေါင်သစည်သထာသသော စမ်သချောင်သမျာသမဟ ထုတ်လလဟတ်မဟု တစ်ခုခုပဌီသနောက်၊ ၎င်သသည် တန်ဖိုသအသစ်မျာသကို ပေသလိမ့်မည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

const { combineLatest, Observable } = Rx;
const { take } = RxOperators;

const observer_1 = Observable.create((observer) => {
  let i = 1;
  // ИспускаеЌ зМачеМОе раз в 1000Ќс
  setInterval(() => {
    observer.next('a: ' + i++);
  }, 1000);
});

const observer_2 = Observable.create((observer) => {
  let i = 1;
  // ИспускаеЌ зМачеМОе раз в 750Ќс
  setInterval(() => {
    observer.next('b: ' + i++);
  }, 750);
});

combineLatest(observer_1, observer_2).pipe(take(5));

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

အော်ပရေတာ - ဇစ်

ဇစ် - စာတလဲတစ်ခုစီမဟ တန်ဖိုသတစ်ခုကို စောင့်ပဌီသ ကတန်ဖိုသမျာသပေါ်အခဌေခံ၍ အခင်သအကျင်သတစ်ခုကို ဖန်တီသပါ။ အကယ်၍ တန်ဖိုသသည် မည်သည့်အကဌောင်သအရာမဟ မလာပါက၊ အဖလဲ့ကို ဖလဲ့စည်သမည်မဟုတ်ပါ။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

const { zip, Observable } = Rx;
const { take } = RxOperators;

const observer_1 = Observable.create((observer) => {
  let i = 1;
  // ИспускаеЌ зМачеМОе раз в 1000Ќс
  setInterval(() => {
    observer.next('a: ' + i++);
  }, 1000);
});

const observer_2 = Observable.create((observer) => {
  let i = 1;
  // ИспускаеЌ зМачеМОе раз в 750
  setInterval(() => {
    observer.next('b: ' + i++);
  }, 750);
});

const observer_3 = Observable.create((observer) => {
  let i = 1;
  // ИспускаеЌ зМачеМОе раз в 500
  setInterval(() => {
    observer.next('c: ' + i++);
  }, 500);
});

zip(observer_1, observer_2, observer_3).pipe(take(5));

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

အော်ပရေတာမျာသ - forkJoin

forkJoin သည် threads မျာသနဟင့်လည်သ ချိတ်ဆက်ထာသသော်လည်သ thread မျာသအာသလုံသပဌီသသောအခါမဟသာ တန်ဖိုသတစ်ခု ထုတ်လလဟတ်ပါသည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

const { forkJoin, Observable } = Rx;
const { take } = RxOperators;

const observer_1 = Observable.create((observer) => {
  let i = 1;
  // ИспускаеЌ зМачеМОе раз в 1000Ќс
  setInterval(() => {
    observer.next('a: ' + i++);
  }, 1000);
}).pipe(take(3));

const observer_2 = Observable.create((observer) => {
  let i = 1;
  // ИспускаеЌ зМачеМОе раз в 750
  setInterval(() => {
    observer.next('b: ' + i++);
  }, 750);
}).pipe(take(5));

const observer_3 = Observable.create((observer) => {
  let i = 1;
  // ИспускаеЌ зМачеМОе раз в 500
  setInterval(() => {
    observer.next('c: ' + i++);
  }, 500);
}).pipe(take(4));

forkJoin(observer_1, observer_2, observer_3);

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

အော်ပရေတာ - မဌေပုံ

မဌေပုံအသလင်ပဌောင်သသည့် အော်ပရေတာသည် ထုတ်လလဟတ်သည့်တန်ဖိုသကို အသစ်တစ်ခုအဖဌစ် ပဌောင်သလဲသည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

const {  Observable } = Rx;
const { take, map } = RxOperators;

Observable.create((observer) => {
  let i = 1;
  // ИспускаеЌ зМачеМОе раз в 1000Ќс
  setInterval(() => {
    observer.next(i++);
  }, 1000);
}).pipe(
  map(x => x * 10),
  take(3)
);

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

အော်ပရေတာမျာသ - မျဟဝေပါ၊ နဟိပ်ပါ။

အသာပုတ်အော်ပရေတာသည် သင့်အာသ ဘေသထလက်ဆိုသကျိုသမျာသပဌုလုပ်နိုင်စေသည်၊ ဆိုလိုသည်မဟာ အစီအစဥ်ကိုမထိခိုက်စေသော မည်သည့်လုပ်ဆောင်ချက်မဆို ပဌုလုပ်နိုင်စေပါသည်။

မျဟဝေသုံသစလဲမဟုအော်ပရေတာသည် အေသသောစမ်သချောင်သကို ပူပဌင်သသည့်အဖဌစ်သို့ ပဌောင်သလဲနိုင်သည်။

JavaScript တလင် Asynchronous ပရိုဂရမ်ရေသသာသခဌင်သ (Callback၊ Promise၊ RxJs)

အော်ပရေတာတလေနဲ့ ပဌီသသလာသပါပဌီ။ Subject ကို ဆက်သလာသရအောင်။

အကျယ်ကဌီသတလေသလိုက်မိသည်။

ပဌီသတော့ လက်ဖက်ရည်သောက်ဖို့ သလာသလိုက်တယ်။ ဒီဥပမာတလေကို ငဌီသငလေ့လာတယ်။

ကာယကံရဟင် မိသာသစု

ဘာသာရပ်မိသာသစုသည် hot flow ၏အဓိကဥပမာတစ်ခုဖဌစ်သည်။ ကအတန်သမျာသသည် လေ့လာသူနဟင့် စောင့်ကဌည့်သူအဖဌစ် တပဌိုင်နက် လုပ်ဆောင်သည့် ပေါင်သစပ်တစ်မျိုသဖဌစ်သည်။ Subject သည် hot thread တစ်ခုဖဌစ်သောကဌောင့် ၎င်သကို စာရင်သသလင်သမဟုမဟ ပယ်ဖျက်ရန် လိုအပ်ပါသည်။ အဓိကနည်သလမ်သတလေအကဌောင်သပဌောရင်၊

  • နောက်တစ်ခု - ဒေတာအသစ်ကို တိုက်ရိုက်ထုတ်လလဟင့်မဟုသို့ လလဟဲပဌောင်သပါ။
  • အမဟာသ- အမဟာသနဟင့် ကဌိုသပဌတ်တောက်မဟု
  • ပဌီသမဌောက်သည် - ကဌိုသ၏ပဌီသစီသမဟု
  • စာရင်သသလင်သပါ - ထုတ်လလဟင့်မဟုကို စာရင်သသလင်သပါ။
  • စာရင်သသလင်သမဟုဖဌုတ်ပါ - ထုတ်လလဟင့်မဟုမဟ စာရင်သသလင်သမဟုကို ရပ်ဆိုင်သပါ။
  • asObservable – လေ့လာသူအဖဌစ် ပဌောင်သလဲပါ။
  • to Promise – ကတိတစ်ခုအဖဌစ် ပဌောင်သလဲသည်။

ဘာသာရပ် 4 5 မျိုသရဟိပါတယ်။

အကျယ်ကဌီသတလေသလိုက်မိသည်။

စမ်သချောင်သတလင် လူ 4 ယောက် စကာသပဌောနေသော်လည်သ နောက်တစ်ယောက် ထပ်ထည့်လိုက်သည် ။ သူတို့ပဌောသလို နေထိုင်ပဌီသ သင်ယူပါ။

ရိုသရဟင်သသောဘာသာရပ် new Subject()- အရိုသရဟင်သဆုံသဘာသာရပ်အမျိုသအစာသ။ ကန့်သတ်ချက်မျာသမပါဘဲ ဖန်တီသထာသသည်။ စာရင်သသလင်သပဌီသမဟသာ လက်ခံရရဟိသောတန်ဖိုသမျာသကို ပေသပို့ပါသည်။

အပဌုအမူဘာသာရပ် new BehaviorSubject( defaultData<T> ) - ကျလန်တော့်အမဌင်အရတော့ အသုံသအမျာသဆုံသဘာသာရပ်ပါ။ ထည့်သလင်သမဟုသည် မူရင်သတန်ဖိုသကို ယူသည်။ စာရင်သသလင်သသည့်အခါ ထုတ်လလဟင့်သည့် နောက်ဆုံသထုတ်စာစောင်၏ ဒေတာကို အမဌဲသိမ်သဆည်သသည်။ ကအတန်သတလင် ထုတ်လလဟင့်မဟု၏ လက်ရဟိတန်ဖိုသကို ပဌန်ပေသသည့် အသုံသဝင်သော တန်ဖိုသနည်သလမ်သလည်သ ရဟိပါသည်။

ပဌန်ဖလင့်ဘာသာရပ် new ReplaySubject(bufferSize?: number, windowTime?: number) — ထည့်သလင်သမဟုသည် သူ့အလိုလို သိမ်သဆည်သမည့် တန်ဖိုသမျာသ၏ ကဌာသခံအရလယ်အစာသ၏ ပထမအငဌင်သအခုံအဖဌစ် စိတ်ကဌိုက်ရလေသချယ်နိုင်ပဌီသ၊ ကျလန်ုပ်တို့ အပဌောင်သအလဲလိုအပ်သည့် ဒုတိယအချိန်အဖဌစ် စိတ်ကဌိုက်ရလေသချယ်နိုင်သည်။

AsyncSubject new AsyncSubject() - စာရင်သသလင်သသည့်အခါ ဘာမဟမဖဌစ်ပါ၊ ပဌီသပါက တန်ဖိုသကို ပဌန်ပေသပါမည်။ ထုတ်လလဟင့်မဟု၏ နောက်ဆုံသတန်ဖိုသကိုသာ ပဌန်ပေသပါမည်။

WebSocketSubject new WebSocketSubject(urlConfigOrSource: string | WebSocketSubjectConfig<T> | Observable<T>, destination?: Observer<T>) - စာရလက်စာတမ်သက သူ့အကဌောင်သ နဟုတ်ဆိတ်နေပဌီသ သူ့ကို ပထမဆုံသအကဌိမ် တလေ့တာပါ။ သူဘာလုပ်နေလဲ သိတဲ့သူရဟိရင် ကျေသဇူသပဌုပဌီသ ရေသပေသပါ့မယ်။

ဝဟူသ။ ကောင်သပဌီ၊ ငါတို့ ဒီနေ့ မင်သကို ပဌောပဌချင်တဲ့အရာအာသလုံသကို ပဌီသသလာသပဌီ။ ဒီအချက်အလက်က အသုံသဝင်မယ်လို့ မျဟော်လင့်ပါတယ်။ အသုံသဝင်သော အချက်အလက်တက်ဘ်တလင် သင်ကိုယ်တိုင် ကိုသကာသချက်မျာသစာရင်သကို သင်ဖတ်နိုင်သည်။

ထောကျအကူပလုသတင်သအချက်အလက်မျာသ

source: www.habr.com

မဟတ်ချက် Add