ES6 Promise、resolve()、then()、reject()、catch()
一、Promise 物件
語法:
new Promise(function (resolve, reject) { // sync or async codes // if success, resolve // if fail, reject });
範例:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> </head> <body> <script> function getData() { return new Promise((resolve, reject) => { let theValue = "T"; if (theValue === 'T') { resolve("YES"); } else { reject("No"); } }); } getData().then(result => { console.log(result); }) .catch(err => { console.log(err); }); </script> </body> </html>
說明:
1、當答應一個承諾,不管成功(resolve)或失敗(reject),都要回報回去,
這樣使用 Promise 物件才會有義意(你也可以不回報,那就屬於 padding 狀態,請往下看第五項)。
2、function (resolve, reject) 中的 resolve、reject 非關鍵字,
固定第一個參數是 fulfilled (resolve) 用途;第二個參數是 rejected (reject) 用途。
3、function (resolve, reject) 中的 resolve 參數為必要項、reject 參數為選項。
4、function (resolve, reject) 中的 resolve 參數是一個 function、reject 參數也是一個 function。
二、resolve()、then()
一個承諾,做完了,可以回報一個 resolve 的字串信息
var resolvePromise = new Promise(function (resolve) { setTimeout(function () { resolve('the resolve message'); }, 1000); });
所以當許下一個承諾,可以用 then 來接收其成功的回報,並在 then 裡做其他事情,
var resolvePromise = new Promise(function (resolve) { setTimeout(function () { resolve('the resolve message'); }, 1000); }); resolvePromise.then(function (resolveMessage) { console.log(resolveMessage); });
此例為在 then 裡印出「成功的回報」的字串值。
then() 的語法為 Promise.then(onFulfilled[, onRejected])。
onFulfilled 參數是一個 function,當 promise 成功時會呼叫;
onRejected 參數是一個 function,其參數為選項,當 promise 失敗時會呼叫。
三、reject()、catch()
function resolve 回傳的字串信息可以用 then 來接,相同的,
function reject 回傳的字串信息可以用 catch 來接。
一個承諾,做完了,可以回報一個 reject 的字串信息
var rejectPromise = new Promise(function (resolve, reject) { setTimeout(function () { reject('the reject message'); }, 1000); });
所以當許下一個承諾,可以用 catch 來接收其失敗的回報,並在 catch 裡做其他事情,
var rejectPromise = new Promise(function (resolve, reject) { setTimeout(function () { reject('the reject message'); }, 1000); }); rejectPromise.catch(function (rejectMessage) { console.log(rejectMessage); });
此例為在 catch 裡印出「失敗的回報」的字串值。
四、Promise Chain
var resolvePromise = new Promise(function (resolve) { setTimeout(function () { resolve('the resolve message'); }, 1000); }); resolvePromise.then(Show).then(Accomplish); function Show(resolveMessage) { console.log("Show " + resolveMessage); return resolveMessage; } function Accomplish(receiveMessage) { console.log("Accomplish " + receiveMessage); }
承諾是可以串接的,如範例,then function 執行完後,
then function 執行完後,會 return 字串值包裹成一個 Promise,並回傳回去。
五、pending
一個承諾做完故意不回報,那該「承諾」的狀態就是屬於 pending。
var resolvePromise = new Promise(function (resolve) { setTimeout(function () { //resolve('the resolve message'); }, 1000); }); console.log(resolvePromise);
六、其他範例
function apple() { console.log("apple"); return new Promise( function (resolve, reject) { resolve("apple sucess"); } ); } var m = apple().then( (value) => { console.log(value); } ); function banana() { console.log("banana"); return new Promise( function (resolve, reject) { reject("banana fail"); } ); } var n = banana().catch( (value) => { console.log(value); } ); function kiwi() { console.log("kiwi"); return new Promise( function (resolve, reject) { //resolve("kiwi sucess"); reject("kiwi fail"); } ); } var o = kiwi().then( (value) => { console.log("onCompleted " + value); }, (value) => { console.log("onRejected " + value); } );
說明:
1、then() 方法為異步執行,當.then()前的方法執行完後再執行 then() 內部的程序,
這樣也確保了 .then() 前的方法一定會被執行。
參考資料: