JavaScript Promise
- Föregående sida JS Asynkron
- Nästa sida JS Async
"I Promise a Result!"
"Producing code" är kod som kan ta tid
"Consuming code" är kod som måste vänta på ett resultat
Promise är ett JavaScript-objekt som länkar genereringskod och konsumtionskod
JavaScript Promise-objekt
JavaScript Promise-objekt innehåller produktionskod och anrop till konsumtionskod:
Promise-syntaks
let myPromise = new Promise(function(myResolve, myReject) { // "Producing Code" (kan ta tid) myResolve(); // Vid framgång myReject(); // Vid fel }); // "Consuming Code" (måste vänta på en löst löfte) myPromise.then( function(value) { /* Kód som körs vid framgång */ }, function(error) { /* Kód som körs vid fel */ } );
När kodkörningen får ett resultat, bör den anropa en av två tillbaka-kall.
Resultat | Anropa |
---|---|
Lyckat | myResolve(result value) |
Fel | myReject(error object) |
Promise-objektattribut
JavaScript Promise-objekt kan vara:
- Pending
- Fulfilled
- Rejected
Ett Promise-objekt stöder två attribut:state och result.
När ett Promise-objekt "pending" (arbetar), är resultatet undefined.
När ett Promise-objekt "fulfilled", är resultatet ett värde.
När ett Promise-objekt är "rejected", är resultatet ett error-objekt.
myPromise.state | myPromise.result |
---|---|
"pending" | undefined |
"fulfilled" | Resultatvärde |
"rejected" | error-objekt |
Du kan inte åtkomma Promise-attributen state och result.
Du måste använda Promise-metoder för att hantera Promise.
Hur använder man Promise
以下是使用 Promise 的方法:
myPromise.then( function(value) { /* code if successful */ }, function(error) { /* code if some error */ } );
Promise.then() 有两个参数,一个是成功时的回调,另一个是失败时的回调。
两者都是可选的,因此您可以为成功或失败添加回调。
实例
function myDisplayer(some) { document.getElementById("demo").innerHTML = some; } let myPromise = new Promise(function(myResolve, myReject) { let x = 0; // 生成代码(这可能需要一些时间) if (x == 0) { myResolve("OK"); } else { myReject("Error"); } }); myPromise.then( function(value) {myDisplayer(value);}, function(error) {myDisplayer(error);} );
JavaScript Promise 实例
为了演示 Promise 的使用,我们将使用上一章中的回调实例:
- 等待超时
- 等待文件
等待超时
使用回调的例子
setTimeout(function() { myFunction("I love You !!!"); }, 3000); function myFunction(value) { document.getElementById("demo").innerHTML = value; }
使用 Promise 的例子
let myPromise = new Promise(function(myResolve, myReject) { setTimeout(function() { myResolve("I love You !!"); }, 3000); }); myPromise.then(function(value) { document.getElementById("demo").innerHTML = value; });
等待文件
使用回调的例子
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);
使用 Promise 的例子
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 inte funnen"); } }; req.send(); }); myPromise.then( function(value) {myDisplayer(value);}, function(error) {myDisplayer(error);} );
Webbläsarstöd
ECMAScript 2015, också känd som ES6, introducerade JavaScript Promise-objekt.
Nedanstående tabell anger den första webbläsarversionen som helt stöder Promise-objekt:
Chrome | IE | Firefox | Safari | Opera |
---|---|---|---|---|
Chrome 33 | Edge 12 | Firefox 29 | Safari 7.1 | Opera 20 |
2014 år 2 | 2015 år 7 | 2014 år 4 | 2014 år 9 | 2014 år 3 |
- Föregående sida JS Asynkron
- Nästa sida JS Async