„JavaScript“ asinchronizavimo / laukimo elgsenos patikslinimas
Kuriant šiuolaikinį „JavaScript“, async/laukti tapo esminiu asinchroninio kodo tvarkymo įrankiu. Nepaisant jo naudingumo, daugelis kūrėjų susiduria su painiava, kai reikia numatyti tikslų išėjimų laiką funkcijose, kuriose naudojami šie metodai. Tai ypač pasakytina apie kodavimo vertinimus, tokius kaip „Adaface“, kur labai svarbu suprasti asinchroninių operacijų srautą.
Problema, su kuria dirbate, yra dvi asinchroninės funkcijos, kurių elgesys iš pažiūros panašus, bet skirtingi rezultatai laiko atžvilgiu. Iš pirmo žvilgsnio gali atrodyti, kad abi funkcijos užtrunka 10 sekundžių, tačiau tikrasis atsakymas nustebina daugelį kūrėjų, nes jis apima gilesnį supratimą, kaip įgyvendinami pažadai.
Šiuo straipsniu siekiama paaiškinti kodą ir paaiškinti, kaip async ir laukti mechanikos darbą, taip pat kaip pažado sprendimo tvarka įtakoja galutinį rezultatą. Pasibaigus šiam tikslui, turėtumėte aiškiau suprasti, kaip laiko nustatymas veikia naudojant asinchroninį „JavaScript“.
Pasinerkime į kodą, kad suprastume, kodėl išvedama pirmoji funkcija 24 po 5 sekundžių, o antroji funkcija taip pat išveda 24 bet su kitokia pažadų struktūra. Turėdami šias žinias būsite geriau pasirengę būsimiems pokalbių vertinimams.
komandą | Naudojimo pavyzdys |
---|---|
setTimeout | setTimeout(() =>setTimeout(() => { res(x); }, 5000); Ši komanda vykdo funkciją po nurodyto uždelsimo. Šiame kontekste jis naudojamas asinchroniniam elgesiui imituoti, grąžinant reikšmę po 5 sekundžių. |
naujas pažadas | return new Promise(res =>return new Promise(res => {...}); Sukuria naują pažadą, apimantį asinchroninį kodą, kuris leidžia išspręsti arba atmesti reikšmes, kai atliekama asinchronizavimo operacija. |
laukti | const f = laukti po 5s(3); Pristabdo asinchroninės funkcijos vykdymą, kol pažadas bus įvykdytas, todėl kodas asinchroninėje funkcijoje veiktų sinchroniškai. |
asinchroninė funkcija | async function mult(input) {...} Deklaruoja asinchroninę funkciją, leidžiančią naudoti laukti viduje, kad asinchronines operacijas atliktumėte švariai ir skaitomai. |
tada | mult(2).then(value =>mult(2).ten(reikšmė => {...}); Prie pažado prideda perskambinimą. Kai pažadas įvykdomas, grąžinimas vykdomas su išspręsta verte. |
Pažadėk sutapimą | const f = after5s(3); const g = after5s(4); Tai leidžia dviem pažadams vykdyti lygiagrečiai, nelaukiant, kol vienas išsispręs prieš pradedant kitą, taip pagerinant našumą. |
console.log | console.log(value); Išveda vertę į konsolę derinimo arba rezultatų tikrinimo tikslais. |
res | res(x); Santrumpa skirta išspręsti pažaduose raginama pažymėti pažadą kaip įvykdytą ir grąžinti vertę. |
įvesties * laukti f | return input * laukti f * laukti g; Padaugina įvestį iš dviejų asinchroninių operacijų išspręstų reikšmių, užtikrinant, kad abu pažadai būtų įvykdyti prieš atliekant skaičiavimą. |
Asinchroninių operacijų tyrinėjimas naudojant „JavaScript“.
Pateikti scenarijai demonstruoja asinchroninių operacijų galią JavaScript naudojant async ir laukti raktinius žodžius. Pagrindinė idėja yra efektyviai tvarkyti asinchronines užduotis, tokias kaip atidėtos operacijos. Abiejuose pavyzdžiuose funkcija po 5 s (x) imituoja 5 sekundžių delsą, grąžindamas pažadą, kuris išsprendžiamas su verte x. Šis delsimas yra būtinas norint suprasti operacijų seką ir tai, kaip pažadai sąveikauja su funkcijos srautu.
Pirmoje funkcijoje mult (įvestis), kodas iš eilės laukia, kol bus išspręsti du pažadai. The laukti raktinis žodis užtikrina, kad kodas pristabdytų vykdymą, kol bus grąžintas pažadas after5s (3) yra išspręsta. Tada, įvykdžius pirmąjį pažadą, kodas laukia dar 5 sekundes antrojo pažado after5s (4) išspręsti. Dėl to bendras laukimo laikas yra 10 sekundžių, kol bus atliktas skaičiavimas. Padauginus įvestį iš abiejų išspręstų reikšmių, gaunamas galutinis rezultatas.
Antroji funkcija, second_mult (įvestis), pagerina našumą pradėdamas abu pažadus vienu metu. Priskirdamas after5s (3) ir after5s (4) kintamiesiems prieš taikydami laukti, abu pažadai vyksta lygiagrečiai. Kai kodas pasiekia laukti pareiškimus, laukiama, kol išsipildys abu pažadai, tačiau jie jau vykdomi, todėl bendras laukimo laikas sutrumpėja iki vos 5 sekundžių. Šis vienu metu vykdomas vykdymas pabrėžia asinchroninių operacijų optimizavimo svarbą.
Šie scenarijai parodo, kaip async ir await gali būti naudojami švariai tvarkyti asinchroninį kodą. Norint optimizuoti našumą, labai svarbu suprasti, kada vienu metu arba nuosekliai vykdyti asinchronines užduotis. The second_mult Funkcijos metodas parodo naudą išvengiant nereikalingų vėlavimų, o pirmasis pavyzdys yra naudingas, kai operacijos turi būti atliekamos tam tikra tvarka. Abu pavyzdžiai yra plačiai taikomi realaus pasaulio scenarijuose, kur pažadų tvarkymas reikalingas, pvz., gauti duomenis iš API arba atlikti operacijas, kurios priklauso nuo išorinių išteklių.
Asinchronizavimo / laukimo elgsena, paaiškinta „JavaScript“ laiku
Šiame pavyzdyje demonstruojamos asinchroninės operacijos naudojant „JavaScript“. async ir laukti funkcijas.
function after5s(x) {
return new Promise(res => {
setTimeout(() => {
res(x);
}, 5000);
});
}
// First approach using async/await with sequential waits
async function mult(input) {
const f = await after5s(3);
const g = await after5s(4);
return input * f * g;
}
// Calling the function and handling the promise resolution
mult(2).then(value => {
console.log(value); // Output: 24 after 10 seconds
});
Asinchronizavimo optimizavimas / laukimas, kol bus vykdomas vienu metu
Ši kodo versija optimizuoja asinchronizavimo procesą naudodama pažadų sugretinimą, kad nereikėtų laukti kiekvieno pažado nuosekliai.
function after5s(x) {
return new Promise(res => {
setTimeout(() => {
res(x);
}, 5000);
});
}
// Second approach optimizing by starting both promises concurrently
async function second_mult(input) {
const f = after5s(3); // Starts promise immediately
const g = after5s(4); // Starts second promise concurrently
return input * await f * await g;
}
// Calling the function and handling the promise resolution
second_mult(2).then(value => {
console.log(value); // Output: 24 after 5 seconds
});
Asinchroninių šablonų įvaldymas JavaScript
Viena iš svarbiausių šiuolaikinio JavaScript koncepcijų yra efektyvus asinchroninių užduočių tvarkymas. Nors async/laukti sintaksė supaprastina asinchroninio kodo skaitymą, yra ir kitų veiksnių, į kuriuos kūrėjai turi atsižvelgti. Svarbus asinchroninių funkcijų naudojimo aspektas yra suprasti, kaip „JavaScript“ valdo renginio kilpa ir asinchroninių skambučių krūvą. Įvykio ciklas leidžia „JavaScript“ vienu metu vykdyti kelias užduotis, net ir vienos gijos aplinkoje, į eilę nukreipiant neblokuojančias užduotis, pvz., pažadus, ir tęsiant kito kodo vykdymą.
Dažnai nepastebimas asinchroninių operacijų elementas yra klaidų tvarkymas. Naudodami sintaksę asinchronizacija / laukimas, kūrėjai gali suvynioti savo kodą į a pabandyk... pagauk blokas, kad galėtumėte grakščiai valdyti pažadų atmetimus ir kitas klaidas. Šis metodas užtikrina, kad visos klaidos, atsirandančios atliekant asinchroninę operaciją, būtų užfiksuotos ir apdorojamos nenutraukiant programos srauto. Asinchroninės funkcijos ne tik pagerina našumą, bet ir daro sudėtingą klaidų tvarkymą efektyvesnį ir lengviau derinamą.
Kita svarbi sritis – kaip Pažadėk.visi gali būti naudojamas keliems pažadams vienu metu vykdyti. Skirtingai nuo pažadų laukimo nuosekliai, kaip pirmame pavyzdyje, Pažadėk.visi vienu metu vykdo visus pažadus ir pateikia rezultatus masyve. Šis metodas yra labai naudingas atliekant kelis API iškvietimus arba atliekant kelias užduotis, kai vykdymo tvarka nėra svarbi. Norint parašyti optimalų ir keičiamo dydžio „JavaScript“ kodą, labai svarbu suprasti, kaip tinkamai struktūrizuoti lygiagrečias užduotis.
Dažnai užduodami klausimai apie async/laukti JavaScript
- Koks tikslas async „JavaScript“?
- The async raktinis žodis leidžia funkcijai grąžinti pažadą ir leidžia naudoti await funkcijos viduje.
- Ką daro await raktažodis daryti?
- The await raktinis žodis pristabdo funkcijos vykdymą, kol pažadas bus įvykdytas, užtikrinant, kad asinchroninės užduotys būtų tvarkomos sinchroniškiau.
- Kaip „JavaScript“ valdo asinchroninio kodo vykdymą?
- JavaScript naudoja event loop tvarkyti asinchronines užduotis, leidžiančias vykdyti neblokuojančią kodą net ir vienos gijos aplinkoje.
- Kuo skiriasi nuoseklus ir lygiagretusis asinchroninis vykdymas?
- Vykdant nuosekliai, kiekvienas await pristabdo funkciją, o vienu metu vykdant, visi pažadai vykdomi vienu metu, sumažinant laukimo laiką.
- Kaip veikia klaidų tvarkymas naudojant async/wait?
- Su try...catch, asinchroninių funkcijų klaidos pagaunamos ir apdorojamos, neleidžiant programai strigti.
Asinchroninio vykdymo užbaigimas „JavaScript“.
„JavaScript“ asinchronizavimo / laukimo funkcija yra galingas būdas valdyti asinchronines operacijas, todėl kodas yra skaitomas ir efektyvesnis. Pateiktuose pavyzdžiuose naudojamas laukti užtikrina tinkamą sekos tvarkymą, kai pirmasis pavyzdys paleidžia pažadus nuosekliai, o antrasis vykdo juos vienu metu.
Suprasdami pažadų įvykdymo svarbą, kūrėjai gali išvengti nereikalingo delsimo ir pagerinti programos našumą. Nesvarbu, ar tai susiję su API, ar sudėtingomis asinchroninėmis užduotimis, šių funkcijų panaudojimas gali žymiai pagerinti funkcionalumą ir kodo aiškumą.
Nuorodos ir išoriniai šaltiniai
- Šiame straipsnyje panaudota pareigūno informacija MDN žiniatinklio dokumentai asinchronizuoti / laukti , kuriame pateikiamas išsamus asinchroninio programavimo „JavaScript“ vadovas.
- Norėdami gauti daugiau informacijos apie „JavaScript“ interviu vertinimus, „Adaface JavaScript“ internetinis testas buvo konsultuojamasi, pateikiant realius interviu metu naudotų techninių testų pavyzdžius.