Promiside sissejuhatus JavaScriptis
Te juba teate, et kõne tagasimudeli asünkroonsuse kasutamine viib kergesti olukorrani callback hell. Seetõttu võeti JavaScripti kasutusele uus mudel nimega promis (promise). Õppigem seda mudelit.
Promis kujutab endast objekti, kuhu parameetrina edastatakse funktsioon, mille sees tuleb paigutada meie asünkroonne kood:
let promise = new Promise(function() {
// asünkroonne kood
});
Nagu näete, kirjutasin promisega objekti
muutujasse promise. Mõnes muus
kohas koodis võin sellele muutujale rakendada
meetodit then, edastades sinna funktsiooni
koodiga, mis tuleb täita pärast
selle promisi loomisel kirjutatud asünkroonse koodi
lõppu:
promise.then(function() {
// täidetakse asünkroonse koodi lõppedes
});
Kõlab segaselt, nii et vaatame näidet. Oletame, et mul on selline asünkroonne kood:
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
Oletame, et ma tahan selle jaoks lahendada meie põhilise
asünkroonsuse ülesande: täita mingi
kood pärast taimeri käivitumist. Samas
ma ei soovi seda koodi paigutada taimeri sisse
ja soovin, et sellesse koodi mingil moel satuks tulemus,
mille ma kirjutasin muutujasse result.
Üldiselt oleme selle ülesande lahendanud eelmistes
õppetundides läbi kõnetagastuste ja tellimuste. Vaatame
nüüd, kuidas seda teha promiside kaudu.
Alustuseks tuleb meie asünkroonne kood mähkida promisisse:
let promise = new Promise(function() {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
});
Sellest aga ei piisa. Me peame otseselt määrama, et meie asünkroonne kood on lõppenud. Selles aitab meid spetsiaalne lõpetamisfunktsioon, mis automaatselt saabub esimeseks parameetriks funktsioonile, kui see on määratud:
let promise = new Promise(function(resolve) { // määrame parameetri
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
});
Lõpetamisfunktsiooni abil saame otseselt määrata promisile, et asünkroonne kood on lõppenud. Selleks peame kutsuma selle funktsiooni välja meile vajalikus kohas:
let promise = new Promise(function(resolve) {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
resolve(); // lõpetame promisi
}, 3000);
});
Samuti, kui soovime edastada väljapoole mingit asünkroonse koodi tulemust, saame selle edastada parameetrina meie lõpetamisfunktsioonile:
let promise = new Promise(function(resolve) {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
resolve(result); // edastame tulemuse
}, 3000);
});
Loomulikult võib lahti saada vahepealsest muutujast:
let promise = new Promise(function(resolve) {
setTimeout(function() {
resolve([1, 2, 3, 4, 5]);
}, 3000);
});
Nüüd saame igas muus kohas välja kutsuda
meie promisi meetodi then:
promise.then(function() {
// käivitub promisi lõppedes
});
Promisi töö tulemus satub esimesse funktsiooni parameetrisse, kui soovime selle määrata:
promise.then(function(result) {
console.log(result); // väljastab massiivi tulemusega
});
Tehke promis, mille sees on viivitus
5 sekundit, mille järel promis peab
valmima, tagastades oma tulemusena mingi
teksti. Kuva see tekst ekraanile.