promise 是 es6 提供的一種非同步程式設計的解決方案: 將非同步操作以同步操作的流程表達出來,避免了層層巢狀的**函式(解決非同步函式**地獄的問題)。
promise 物件儲存著非同步操作的結果。
首先看非同步的概念,這在《ecmascript6入門》中介紹的很好:
所謂"非同步",簡單說就是乙個任務不是連續完成的,可以理解成該任務被人為分成兩段,先執行第一段,然後轉而執行其他任務,等做好了準備,再回過頭執行第二段。而js對非同步程式設計的實現就是通過**函式(把任務的第二段單獨寫在乙個函式裡面,等到重新執行這個任務的時候,就直接呼叫這個函式),**函式本身並沒有問題,問題就在於巢狀的形式容易因為層次太深而變得混亂難以維護(多個非同步操作形成了強耦合,只要乙個曹組哦需要修改,它的上層和下層**函式都要跟著修改),因此為了解決這個問題,promise 採用了新鏈式寫法,使得任務不同的執行階段變得清晰。比如,有乙個任務是讀取檔案進行處理,任務的第一段是向作業系統發出請求,要求讀取檔案。然後,程式執行其他任務,等到作業系統返回檔案,再接著執行任務的第二段(處理檔案)。這種不連續的執行,就叫做非同步。
相應地,連續的執行就叫做同步。由於是連續執行,不能插入其他任務,所以作業系統從硬碟讀取檔案的這段時間,程式只能幹等著。
promise 特點:
1. 其狀態不受外界影響:
pending: 進行中
fulfilled: 已成功
rejected: 已失敗
2. 狀態一旦改變便不會再變。
pending -> fulfilled: resolved => then(res => )
pending -> rejected: rejected => catch(err => )
建立乙個 promise 例項
var promise = new promise((resolve, reject) =>else
})promise.then(value => , error => )
promise 新建後就會立即執行
resolved 的 promise 是在本輪事件迴圈的末尾執行,總是晚於本輪迴圈的同步任務。
呼叫resolve或reject以後,promise 的使命就完成了,後繼操作應該放到then方法裡面,而不應該直接寫在resolve或reject的後面。所以,最好在它們前面加上return語句,這樣就不會有意外。
new promise((resolve, reject) =>)
promise.prototype.then()
為 promise 例項新增狀態改變時的**函式。then 方法的第乙個引數是 resolved 狀態的**函式,第二個引數(可選)是 rejected 狀態的**函式(更多的是直接寫成 catch 方法)。
then方法返回的是乙個新的 promise 例項(注意,不是原來那個 promise 例項)。因此可以採用鏈式寫法,即 then 方法後面再呼叫另乙個 then 方法。
getjson("/posts.json").then(function(json) ).then(
function
(post) );
promise 中的 then 和 catch 方法可以交換位置,但是執行順序也會被交換,如果在 then 方法中報錯,在前面的 catch 中就無法捕獲了。
catch 中可以繼續丟擲錯誤,因此 catch 後面可以繼續寫 catch 方法來捕獲錯誤。
promise.all()
var p = promise.all([p1, p2, p3])
p1, p2, p3 都是 promise 例項,只有這些例項的狀態都變成 fulfilled ,p 的狀態才會變成 fulfilled,否則只要有乙個例項的狀態變成 rejected,這個例項被 rejected 返回的值就會傳遞給 p
done()
promise 物件的**鏈,最後乙個方法(then 或 catch)丟擲的錯誤都無法**獲,因此可以在**鏈末尾使用 done 方法來處理丟擲的錯誤。
asyncfunc().then(f1)
.catch
(r1)
.then(f2)
.done();
finally()
用於指定不管 promise 物件最後狀態如何都會執行的操作。
server.listen(0) .then(function () )
.finally(server.stop);
參考:
ES6 學習 Promise物件
1.promise含義 可以將promise物件看成是乙個容器,它儲存著未來才會結束的某個事件 一般是非同步操作事件 的結果,各 種非同步操作都可以用promise物件來處理 promise的特點 1 promise物件有三個狀態 pending 進行中 fulfilled 已成功 和rejecte...
ES6學習之Promise物件
promise 是非同步程式設計的一種解決方案,比傳統的解決方案 函式和事件 更合理和更強大。原生提供了promise 物件。promise 簡單說就是乙個容器,裡面儲存著之後才執行的事件。從語法層面來說,promise 是乙個物件,從它可以獲取非同步操作的訊息。promise 提供統一的 api,...
es6學習筆記(一)
最近在看阮一峰的 es6標準入門 打算在每天早起上班前看一小時,然後寫個部落格總結 關於第二章let,const命令的總結 1 暫時性死區 只要進入當前作用域,所要使用的變數就已經存在,但是,不可獲取,只有等到宣告變數的那一行 出現,才可以獲取和使用該變數 2 函式宣告語句和函式表示式的區別 函式宣...