promise知識點小結

斷斷續續學習es6也有一段時間了,趁着開學空閒對知識點作一些小結。javascript

爲何使用promise

談到Promise,咱們知道,這是社區較理想的異步編程解決方案。想要掌握promise,咱們首先要知道其提出緣由。promise的提出很好的解決了多個相互依賴的代碼之間的嵌套問題,好比說C代碼須要B代碼的結果,B代碼須要A代碼的結果,用傳統的方案,會出現層層嵌套的狀況,不易維護。java

promise對象是什麼

promise對象一共有三種狀態es6

  • pending(進行中)
  • fulfilled(已成功)
  • rejected

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對象就決定了執行後面的哪些方法

與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

其實,這些方法,仍是要多使用,多練習,才能駕輕就熟

相關文章
相關標籤/搜索