Si funksionon Async/Await?
Pavarësisht nga të gjitha tiparet e bukura të pjekura në gjuhët moderne të programimit, nën kapuç, ato janë ende mjaft primitive. Pa programim asinkron, thirrjet e gjata drejt shërbimeve të jashtme do të pengonin ekzekutimin e programit. Asinkronizimi/pritja e rregullon këtë problem.
Pse të përdorni Async/Prit?
Shumica e programeve përdorin një thread kryesore dhe ekzekutojnë udhëzimet e CPU-së në mënyrë sekuenciale, por më e rëndësishmja, në mënyrë sinkrone. Nëse duhet të merrni një vlerë nga memorja, ju mbeteni në IOWait për pak, ndërsa prisni që RAM-i juaj të jetë kthej një përgjigje. Nëse keni nevojë të merrni një vlerë nga një disk, mund të mbeteni të mbërthyer për një kohë (prandaj, pse RAM është kaq i dobishëm).
Por, nëse po merrni diçka nga një server në distancë, tani keni një problem të madh. Mund të duhen 5 sekonda ose më shumë që serveri të kthejë një përgjigje, dhe në një program me një fillesë, kjo do të bllokonte ekzekutimin kryesor, duke bërë që faqja juaj të mos reagonte dhe përdoruesit tuaj të largoheshin.
Programimi asinkron është këtu për të shpëtuar përdoruesit. Në JavaScript, forma më themelore e kodit asinkronik është kalimi në një kthim thirrjeje, zakonisht një funksion anonim, që do të ekzekutohet pasi të jetë përfunduar kërkesa në ueb. Ju mund ta bëni këtë duke përdorur Ajax si dhe bibliotekat e tjera të kërkesave.
ajax('https://example.com/api', (response) => {
console.log(response);
});
Kjo mund të bëhet shumë e çrregullt kur kemi të bëjmë me kërkesa të shumta të njëkohshme dhe shumë funksione, kështu që JavaScript krijoi Premtimet. Këto janë objekte mbështjellëse që përfaqësojnë variabla asinkrone që ende po marrin vlerat e tyre. Premtimet mund të kthehen kur përdorni funksione si JavaScript e integruar në fetch
. Ju mund të regjistroni një funksion të kthimit të thirrjes duke përdorur .then()
, i cili ju lejon të lidhni së bashku disa kërkesa.
fetch('http://example.com/api')
.then(response => response.json())
.then(data => console.log(data));
Kthimi i një objekti si ky lejon përdorimin e veçorive të tjera si Promise.All, të cilat mund të ekzekutojnë premtime të shumta dhe të kryejnë një kthim të vetëm pas përfundimit të tyre.
Ky është një hap i madh përpara, por në të vërtetë thjesht e zhvendos problemin. Shkrimi i një kodi si ky është ende kundërintuitiv, duhet të menaxhoni të gjitha premtimet dhe të siguroheni që gjithçka është në rregull. Nëse pjesa tjetër e kodit varet nga rezultati i premtimit, do t'ju duhet ta zhvendosni atë kod në bllokun . më pas
ose të telefononi një funksion të veçantë me të dhënat.
Idealisht, do të ishte më mirë që thjesht të mos shqetësoheshit me premtimet dhe thirrjet. Ju dëshironi të shkruani kod si ky, por JavaScript ose do të ndalojë ekzekutimin e programit ose do ta nxjerrë jashtë funksionit.
doSomething();
var response = fetch('http://example.com/api');
console.log(response.json());
Por, ka një mënyrë më të mirë—asinkronizimi/pritja. Do t'ju duhet ende të punoni me premtimet në fund të ditës, por async/wait ofron një sintaksë më të mirë për përdorimin e tyre.
Për ta përdorur atë, do t'ju duhet të specifikoni funksionin si një funksion async
. Kjo siguron që funksioni të kthejë një premtim që JavaScript mund të veprojë kur thërret këtë funksion. Magjia e vërtetë ndodh me wait
, të cilin mund ta shtoni përpara një Premtimi për t'i thënë motorit JavaScript se ky funksion do të marrë pak dhe duhet të ndalojë funksionin tuaj asinkron deri sa të kthehet, duke liruar kohë për të bërë veprime të tjera dhe për të mbajtur aplikacionin tuaj në funksion.
async function fetchAPI() {
doSomething();
var response = await fetch('http://example.com/api');
console.log(response.json());
}
fetchAPI();
Tani, gjithçka në bllokun asinkronik funksionon në rregull, por nuk e ndalon ekzekutimin e programit për ta bërë këtë. Çdo gjë që vjen pas fetchAPI()
do të jetë ende jashtë funksionit, pasi fetchAPI()
po fillon thjesht ekzekutimin e një funksioni asinkron.
Në thelb, mund të mendoni për prit
si diçka që do t'u kushtoni kërkesave në ueb dhe gjërave të tjera që kërkojnë pak kohë për të kthyer një përgjigje. Mund të përdoret vetëm në një funksion asinkronik dhe ju e përdorni për të pritur në mënyrë eksplicite një funksion që kthen një premtim, në vend që të telefononi . Pastaj()
dhe të kaloni një kthim kthimi.
Asinkronizoj/Prit në gjuhë të tjera
Async/Await nuk është thjesht një koncept JavaScript; është një veçori në shumë gjuhë të tjera programimi, megjithëse zbatimi i saktë mund të ndryshojë pak.
Për shembull, C# ka Tasks, të cilat funksionojnë si Promises dhe përfaqësojnë një operacion asinkronik që kthen diçka. Mund të presësh detyra të tjera brenda funksionit asinkronik, duke lejuar kodin jo-bllokues për operacione si marrja e kërkesave në ueb dhe shkrimi/leximi nga disku ose ruajtëset e jashtme të të dhënave si kova S3.
Ju mund t'i lidhni ato së bashku duke përdorur .ContinueWith(callback)
:
Në varësi të aplikacionit tuaj, mund t'ju duhet të kontrolloni vazhdimisht në temën kryesore nëse detyra është përfunduar. Për shembull, mund të keni një rutinë të përbashkët që ekzekutohet një herë për kornizë dhe kontrollon nëse detyra ka përfunduar me fushën .IsCompleted
. Nëse nuk është, ai jepet deri në kuadrin tjetër, dhe nëse është, mund të vazhdojë të përpunohet në mënyrë sinkrone.