斷斷續續學習es6也有一段時間了,趁着開學空閒對知識點作一些小結。javascript
談到Promise,咱們知道,這是社區較理想的異步編程解決方案。想要掌握promise,咱們首先要知道其提出緣由。promise的提出很好的解決了多個相互依賴的代碼之間的嵌套問題,好比說C代碼須要B代碼的結果,B代碼須要A代碼的結果,用傳統的方案,會出現層層嵌套的狀況,不易維護。java
promise對象一共有三種狀態es6
promise對象有幾種相關方法編程
let promise = new Promise((resolve,reject) => { //.... resolve('2'); //.... //reject('4'); })
最簡單建立對象的方法,就是爲resolve和reject的狀態分別傳遞參數,也就是成功後的信息或是失敗時的提示,固然,不必定要兩種狀態同時都有。promise
then方法,接受兩個參數,第一個爲fulfilled狀態下要進行的步驟,第二個參數可選,指的是rejected狀態下執行的方法
固然,更推薦使用catch方法來定義錯誤狀態下的方法,也和try...catch結構相似異步
promise .then((data) => { //cb // success }) .catch((err) => { // error });
這個對象有幾個特色,異步編程
1.好比狀態一旦更改,就不會再發生變化,也就是說pending狀態一旦轉換成fulfuilled或rejected就再也不變化了。函數
let promise = new Promise((resolve,reject) => { resolve('2'); reject('4'); })
好比上面的代碼,promise在進入fulfulled狀態後就再也不發生變化了,所以reject的操做是無效的。學習
2.好比promise對象建立中的代碼是同步的,而then方法是異步的。ui
let promise = new Promise((resolve, reject) => { console.log('1'); resolve('2'); }); promise.then((resolve,reject) => { console.log(resolve); }) console.log(3); // 1 3 2
promise對象建立之後當即執行,故輸出1,then方法爲異步執行,被放入等待的實踐隊列,在本次事件循環結束時執行,故先打印3,最後打印2。
3.不會主動拋出錯誤
這一點比較特別,意味着咱們必須定義catch方法或then的第二個參數來獲取錯誤,否則,錯誤沒法被發現
4.chain 鏈式結構
then函數的能夠接另外一個then函數,而then函數返回一個promise對象,所以,這一個promise對象就決定了執行後面的哪些方法
then方法與settimeout
這一個問題很是典型,其實只要明白一點:settimeout在下一輪「事件循環」的時候開始執行,Promise.then()在本輪「事件循環」結束時執行。
setTimeout(function () { console.log('1'); }, 0); Promise.resolve().then(function () { console.log('2'); }); console.log('3');
輸出3 2 1
其實,這些方法,仍是要多使用,多練習,才能駕輕就熟