1. 程式人生 > >學習筆記:es6——Promise 物件學習(1)

學習筆記:es6——Promise 物件學習(1)

1Promise的含義:

Promise是非同步程式設計的一種解決方案;

Promise是一個物件,可以獲取非同步操作的訊息,提供統一的api,各種非同步操作都可以用同樣的方式處理;

Promise物件有以下兩個特點:

  1. 物件狀態不受外界影響。Promise代表一個一步操作,有三種狀態:pending(進行中)、fulfilled(已成功)、rejected(已失敗)。只有一步操作的結果可以決定是哪一種狀態,其他任何操作無法改變這個狀態。
  2. 一旦狀態改變,就不會再變,任何時候都可以得到這個結果;

Promise物件的優點: 可以將非同步操作以同步操作的流程表達出來,避免了層層巢狀的回撥函式。控制非同步操作更加容易。

promise物件的缺點: 一旦新建就會立即執行,無法中途取消;如果不設定回撥函式,Promise內部丟擲的錯誤,不會反映到外部;

2基本用法:

es6中規定Promise是一個建構函式,下面創造一個Promise例項:

resolve,reject引數是由js引擎提供,不用自己部署; resolve函式的作用是在非同步操作成功時呼叫,並將非同步操作的結果作為引數傳遞出去; reject函式的作用是在非同步操作失敗時呼叫,並將非同步操作報出的錯誤作為引數傳遞出去; Promise例項生成之後,可以用then方法分別指定resolve和reject狀態的回撥函式; 在這裡插入圖片描述 then方法接受兩個回撥函式作為引數,第一個回撥是Promise物件狀態變為resolve時呼叫,第二個則是Promise物件狀態變為reject時呼叫;

Promise新建後會立即執行 在這裡插入圖片描述 列印結果是1 3 2 新建物件中程式碼立即執行,then方法屬於非同步函式,所以會在所有同步函式執行完成之後執行。

下面是非同步載入圖片的例子: 在這裡插入圖片描述

如果呼叫resolve和reject時帶有引數,這個引數會傳遞給回撥函式;resolve函式的引數除了正常的函式值外,還可能是另一個Promise例項: 在這裡插入圖片描述 p2例項的resolve方法將p1作為引數:一個非同步操作的結果是返回另一個非同步操作; p1的狀態決定了p2的狀態。如果p1的狀態是pending,那麼p2的回撥函式就會等待p1的狀態改變;如果p1的狀態已經是resolved或rejected,那麼p2的回撥函式將會立刻執行。

Promise在呼叫了resolve或reject後任務就完成了,後繼操作應放到then方法裡面執行,所以Promise例項中呼叫了resolve或reject後在後面最好加上return語句

在這裡插入圖片描述