Į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ą:

javascriptlet 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ą:

javascriptpromise.then(function() {
  // vyks pasibaigus asinchroniniam kodui
});

Skamba painiai, todėl pažiūrėkime pavyzdžiu. Tarkime, turiu tokį asinchroninį kodą:

javascriptsetTimeout(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ą:

javascriptlet 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:

javascriptlet 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:

javascriptlet 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:

javascriptlet promise = new Promise(function(resolve) {
  setTimeout(function() {
    let result = [1, 2, 3, 4, 5];
    resolve(result); // perduodame rezultatą
  }, 3000);
});

Žinoma, galima atsikratyti tarpinio kintamojo:

javascriptlet 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:

javascriptpromise.then(function() {
  // suveiks pasibaigus pažadui
});

Pažado veikimo rezultatas pateks į pirmąjį funkcijos parametrą, jei panorėsime jį nurodyti:

javascriptpromise.then(function(result) {
  console.log(result); // išves masyvą su rezultatu
});
Задание 1

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ą.