寫在前面:javascript
在學習微信小程序過程當中瞭解到利用Promise,能夠對事件請求的回調進行優化,避免了多重回調形成的"回調地獄"問題,本文主要用做介紹及記錄在使用Promise過程當中遇到的問題和思考。html
Promise 是一個對象,至關於一個容器,裏面存的是一個異步操做的結果,而且表明一個將來可能會完成的操做。java
Promise的三種狀態:web
Promise的兩種狀態改變的方式:ajax
當異步操做成功時,從pending轉變爲resolved,小程序
當異步操做失敗時,從pending轉變爲rejected。segmentfault
PS.一旦狀態改變,就會一直保持這個狀態,不會再發生變化。當狀態發生變化,promise.then綁定的函數就會被調用。微信小程序
Promise一旦新建就會「當即執行」(它屬於microtask),沒法取消。這也是它的缺點之一。promise
套路通常爲:微信
定義一個函數, 函數內部使用new Promise()的方式來返回一個promise對象,resolve用來保存異步處理成功的結果,reject用來保存異常處理的結果。
而後函數調用,傳參。
用then方法處理鏈式調用, then中的回調用來處理異步結果。
用catch方法處理錯誤狀況,,也能夠用then(null, function() {})代替catch。
then的回調中也可return一個值,會被包裝成一個新的promise對象, 以此能夠繼續調用then方法。
處理同步任務
new Promise((resolve,reject)=>{
resolve(1);
})
.then(res=>{
console.log(res);
});
複製代碼
輸出結果:
1
Ps.當狀態發生變化後執行then方法,並將resolve或reject的結果做爲then方法接受回調函數的參數
複製代碼
處理異步任務
new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve("成功");
},1000);
})
.then(res=>{
console.log(res);
});
複製代碼
輸出結果:
成功
Ps.當異步代碼執行成功時,會調用resolve(...), 當異步代碼失敗時就會調用reject(...)
複製代碼
處理鏈式調用
new Promise((resolve, reject) => {
console.log('初始化');
resolve();
})
.then(() => {
throw new Error('有哪裏不對了');
console.log('執行「這個」」');
})
.catch(() => {
console.log('執行「那個」');
})
.then(() => {
console.log('執行「這個」,不管前面發生了什麼');
});
複製代碼
輸出結果:
初始化
執行「那個」
執行「這個」,不管前面發生了什麼
Ps.由於拋出了錯誤‘有哪裏不對了’,因此前一個‘執行「這個」’沒有被輸出
複製代碼
[1].MDN web docs-developer.mozilla.org/zh-CN/docs/…
[2].AustinNorman:Promise的學習總結-www.ctolib.com/topics-1388…
[3].cz160:利用ES6進行Promise封裝總結-segmentfault.com/a/119000001…
[4].磚用西瓜:Promise到底解決了什麼問題-segmentfault.com/a/119000001…