Promise 是 ES6 眾多好用方法之一,能用簡潔的撰寫方式處理非同步事件,大幅優化 callback hell 造成閱讀困難的問題。
Promise
Promise 是一個建構函式,帶有兩個參數:resolve、reject,分別是用來處理執行成功和失敗時的回傳資訊,格式如下:
1 2 3 4 5 6 7 8 9 10 11
| const doSomething = new Promise((resolve, reject) => { let result = Boolean(Math.round(Math.random())); if (result) { resolve(`Success`); } else { reject(`Failed`); } });
|
Promise (.then .catch)
new Promise()
建立的 Promise 物件提供 .then 和 .catch 兩個方法來分別接收 resolve 和 reject 回傳的資料,撰寫格式如下:
1 2 3 4 5 6 7 8 9
| doSomething .then((data) => { console.log(data); }) .catch((error) => { console.log(error); });
|
Promise + 自訂參數
Promise 不能直接傳入參數,但是可以使用函式建立參數的接口,再回傳 Promise 物件,就能加入其他的參數了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const doSomething = (name) => { return new Promise((resolve, reject) => { let result = Boolean(Math.round(Math.random())); if (result) { resolve(`${name}, success!`); } else { reject(`${name}, failed!`); } }); };
doSomething('Peter') .then((data) => console.log(data)) .catch((error) => console.log(error));
|
串接多個 Promise
Promise 的 then 方法用串接的方式連接下個行為,不像 callback function 需要槽狀層層包覆。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| const doSomethingElse = (str) => { return new Promise((resolve, reject) => { let result = Boolean(Math.round(Math.random())); if (result) { resolve(`Good job, ${str}`); } else { reject(`Bad job, ${str}`); } }); };
doSomething('Peter') .then((result) => { doSomethingElse(result); }) .then((result) => { console.log(result); }) .catch((error) => { console.log(error); });
|
Promise.all
當有不同的資料需要合併處理時使用,只要其中一項失敗就會立刻回傳失敗,不會等其他的非同步跑完,成功時則是以陣列方式回傳資料。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| const doSomething = (name) => { return new Promise((resolve, reject) => { let result = Boolean(Math.round(Math.random())); if (result) { resolve(name); } else { reject(`${name}, failed`); } }); };
Promise.all([ doSomething('Peter'), doSomething('Parker'), doSomething('Porker'), ]) .then((data) => { console.log(`恭喜 ${data.join('、')} 全部成功!`); }) .catch((error) => { console.log(error); });
|