JavaScript Promise
"I Promise a Result!"
"Producing code" (produktionskode) er kode, der tager noget tid
"Consuming code" (forbrugerskode) er kode, der skal vente på et resultat
Promise er et JavaScript-objekt, der forbinder produktionskode og forbrugerskode
JavaScript Promise-objekter
JavaScript Promise-objekter indeholder produktionskode og kald til forbrugerskode:
Promise-syntaks
let myPromise = new Promise(function(myResolve, myReject) { // "Producing Code" (kan tage noget tid) myResolve(); // Ved succes myReject(); // Ved fejl }); // "Consuming Code" (må vente på en opfyldt løfte) myPromise.then( function(value) { /* Kode, der skal køres ved succes */ }, function(error) { /* Kode, der skal køres ved fejl */ } );
Når der udføres kode og der opnås et resultat, skal det kalde én af to tilbagekaldsfunctioner:
Resultat | Kald |
---|---|
Success | myResolve(result value) |
Fejl | myReject(error object) |
Promise-objektets egenskaber
JavaScript Promise-objekter kan være:
- Pending
- Fulfilled
- Rejected
Promise-objekter understøtter to egenskaber:state og result。
Når et Promise-objekt "pending" (arbejder), er resultatet undefined.
Når et Promise-objekt "fulfilled", er resultatet en værdi.
Når en Promise-objekt er "rejected", er resultatet et fejlobjekt.
myPromise.state | myPromise.result |
---|---|
"pending" | undefined |
"fulfilled" | Resultatværdi |
"rejected" | error-objekt |
Du kan ikke få adgang til Promise-ejenskaberne state og result.
Du skal bruge Promise-metoden til at håndtere Promise.
Hvordan bruge Promise
Her er metoderne til brug af Promise:
myPromise.then( function(value) { /* kode hvis succesfuldt */ }, function(error) { /* kode hvis nogen fejl */ } );
Promise.then() har to parametre, en for succes og en for fejl.
Begge er valgfri, så du kan tilføje en callback for succes eller fejl.
Eksempel
function myDisplayer(some) { document.getElementById("demo").innerHTML = some; } let myPromise = new Promise(function(myResolve, myReject) { let x = 0; // Generer kode (dette kan tage noget tid) if (x == 0) { myResolve("OK"); } else { myReject("Error"); } }); myPromise.then( function(value) {myDisplayer(value);}, function(error) {myDisplayer(error);} );
JavaScript Promise-eksempel
For at demonstrere brug af Promise, vil vi bruge callback-eksemplet fra det forrige kapitel:
- Vent på timeout
- Vent på fil
Vent på timeout
Brug af callback-eksempel
setTimeout(function() { myFunction("I love You !!!"); }, 3000); function myFunction(value) { document.getElementById("demo").innerHTML = value; }
Brug af Promise-eksempel
let myPromise = new Promise(function(myResolve, myReject) { setTimeout(function() { myResolve("I love You !!"); }, 3000); }); myPromise.then(function(value) { document.getElementById("demo").innerHTML = value; });
Vent på fil
Brug af callback-eksempel
function getFile(myCallback) { let req = new XMLHttpRequest(); req.open('GET', "mycar.html"); req.onload = function() { if (req.status == 200) { myCallback(req.responseText); } else { myCallback("Error: " + req.status); } } req.send(); } getFile(myDisplayer);
Brug af Promise-eksempel
let myPromise = new Promise(function(myResolve, myReject) { let req = new XMLHttpRequest(); req.open('GET', "mycar.htm"); req.onload = function() { if (req.status == 200) { myResolve(req.response); } else { myReject("Fil ikke fundet"); } }; req.send(); }); myPromise.then( function(value) {myDisplayer(value);}, function(error) {myDisplayer(error);} );
Browser-understøttelse
ECMAScript 2015, også kendt som ES6, introducerede JavaScript Promise-objekter.
Følgende tabel viser den første browserversion, der fuldt ud understøtter Promise-objekter:
Chrome | IE | Firefox | Safari | Opera |
---|---|---|---|---|
Chrome 33 | Edge 12 | Firefox 29 | Safari 7.1 | Opera 20 |
Februar 2014 | Juli 2015 | April 2014 | September 2014 | Marts 2014 |