Įvadas į JavaScript pažadus
Jau žinote, kad naudojant atgalinio kvietimo modelį asinchroniškumui lengvai patenkama į callback hell situaciją. Todėl JavaScript buvo įvestas naujas modelis, vadinamas pažadais (promise). Išmokime šį modelį.
Pažadas yra objektas, kuriam parametru perduodama funkcija, kurios viduje reikia patalpinti mūsų asinchroninį kodą:
let promise = new Promise(function() {
// asinchroninis kodas
});
Kaip matote, objektą su pažadu
įrašiau į kintamąjį promise. Kitoje
kodo vietoje galiu pritaikyti šiam kintamajam
metodą then, perduodant į jį funkciją
su kodu, kuris turi būti vykdomas
pasibaigus asinchroniniam kodui, parašytam
kurdamas šį pažadą:
promise.then(function() {
// vyks pasibaigus asinchroniniam kodui
});
Skamba painiai, todėl pažiūrėkime pavyzdžiu. Tarkime, turiu tokį asinchroninį kodą:
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
Tarkime, noriu išspręsti jam mūsų pagrindinę
asinchroniškumo užduotį: vykdyti tam tikrą
kodą po to, kai suveiks laikmatis. Be to,
nenoriu talpinti šio kodo pačiame laikmatyje
ir noriu, kad į šį kodą kaip nors patektų rezultatas,
parašytas mano kintamajame result.
Iš esmės, šią užduotį sprendėme ankstesnėse
pamokose per atgalinius kvietimus ir prenumeratas. Pažiūrėkime
dabar, kaip tai padaryti per pažadus.
Pirmiausia reikia apvynioti mūsų asinchroninį kodą į pažadą:
let promise = new Promise(function() {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
});
To, tačiau, nepakanka. Mes turime aiškiai nurodyti, kad mūsų asinchroninis kodas pasibaigė. Tam mums padės speciali baigimo funkcija, automatiškai patekianti į pirmąjį funkcijos parametrą, jei jis nurodytas:
let promise = new Promise(function(resolve) { // nurodome parametrą
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
});
Naudodami baigimo funkciją galime aiškiai nurodyti pažadui, kad asinchroninis kodas pasibaigė. Tam turime iškviesti šią funkciją mums reikiamoje vietoje:
let promise = new Promise(function(resolve) {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
resolve(); // užbaigiame pažadą
}, 3000);
});
Be to, jei norime perduoti į išorę kokį nors asinchroninio kodo rezultatą, galime jį perduoti parametru mūsų baigimo funkcijai:
let promise = new Promise(function(resolve) {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
resolve(result); // perduodame rezultatą
}, 3000);
});
Žinoma, galima atsikratyti tarpinio kintamojo:
let promise = new Promise(function(resolve) {
setTimeout(function() {
resolve([1, 2, 3, 4, 5]);
}, 3000);
});
Dabar bet kurioje kitoje vietoje galime iškviesti
mūsų pažado metodą then:
promise.then(function() {
// suveiks pasibaigus pažadui
});
Pažado veikimo rezultatas pateks į pirmąjį funkcijos parametrą, jei panorėsime jį nurodyti:
promise.then(function(result) {
console.log(result); // išves masyvą su rezultatu
});
Sukurkite pažadą, kurio viduje bus delsimas
5 sekundes, po kurio pažadas turi
įvykti, savo rezultatu grąžindamas kokį nors
tekstą. Išveskite šį tekstą į ekraną.