列印出promise,我們能看出promise是乙個建構函式
那什麼是promise?
promise是非同步程式設計的一種解決方案,它有三種狀態,
promise執行完成後,只會有成功和失敗的狀態,並且不可被更改
pending 就緒狀態 => resolved 成功狀態
pending 就緒狀態 => rejected 失敗狀態
讓我們來看一段**
var p = new promise(function(resolved,rejected)else
})
狀態為
resolved時
狀態為 rejected時
當我們定義好p後,p有狀態時,還記得列印出promise的原型上有乙個then方法吧
裡面回傳兩個函式,是幹什麼的呢? 別急,還記得我們剛才說的兩個狀態 resolved 和 rejected 嗎?
因為通過 new promise 會產生乙個物件,並且是有狀態的,且只留下 resolved 和 rejected 乙個。.then後面的函式,就是接收當它是resolved時候做什麼,當它是rejected時候做什麼。
當它是resolved
當它是rejected
這裡也可以用箭頭函式寫
p.then(data => data,err => err)
接下來,我繼續.then
p.then(data => data,err => err).then(data => console.log(data + 'sec'),err => console.log(err + 'err'))
結果
第乙個結果末尾是sec沒有錯,但為什麼第二個結果也是sec而不是err呢?
記得開篇說的 只有成功和失敗狀態,並且不可被更改嗎?
第一次then時,無論結果是 resolved 還是 rejected,他倆始終是常量,是常量的話,就會預設狀態為 resolved。
仔細想想是不是這樣?
讓我們繼續
.then()會返回乙個promise物件,一旦是promise物件,就一定會有狀態。接下來,我們再返回乙個promise物件
p.then(data => new promise((resolved,rejected) => resolved(123)),err => err)
.then(data => console.log(data + 'sec'),err => console.log(err + 'err'))
data返回了乙個 promise的物件,讓它 resolved 並返回123
如果將 resolved 改為 rejected
p.then(data => new promise((resolved,rejected) => rejected(123)),err => err)
.then(data => console.log(data + 'sec'),err => console.log(err + 'err'))
輸出結果
promise的all方法
var p1 = new promise((resolved,rejected) =>)
var p2 = new promise((resolved,rejected) =>)
var p3 = new promise((resolved,rejected) =>)
promise.all([p1,p2,p3]).then(data => console.log(data),err => console.log(err + 'aaa'))
列印結果為
只有在promise的物件都是resolved的時候,它才可以返回。如下
var p1 = new promise((resolved,rejected) =>)
var p2 = new promise((resolved,rejected) =>)
var p3 = new promise((resolved,rejected) =>)
promise.all([p1,p2,p3]).then(data => console.log(data),err => console.log(err + 'aaa'))列印結果為
可以看到全被返回並輸出
promise的race方法
promise的all()方法是全部,而promise的race是指有乙個就可以了,並且誰先到,我用誰。
var p1 = new promise((resolved,rejected) =>,math.random() * 500)
}) var p2 = new promise((resolved,rejected) =>,math.random() * 500)
}) var p3 = new promise((resolved,rejected) =>,math.random() * 500)
})promise.race([p1,p2,p3]).then(data => console.log(data),err => console.log(err + 'aaa'))
輸出結果
關於promise就先到這裡,如果有欠缺的,歡迎各位指出,我會加緊改正。
ES6 學習 Promise物件
1.promise含義 可以將promise物件看成是乙個容器,它儲存著未來才會結束的某個事件 一般是非同步操作事件 的結果,各 種非同步操作都可以用promise物件來處理 promise的特點 1 promise物件有三個狀態 pending 進行中 fulfilled 已成功 和rejecte...
談談 ES6 的 Promise 物件
ajax 如果幾個非同步操作之間並沒有前後順序之分 例如不需要前乙個請求的結果作為後乙個請求的引數 時,同樣需要等待上乙個操作完成再實行下乙個操作。function helloworld ready else helloworld true then function message functio...
ES6學習之Promise物件
promise 是非同步程式設計的一種解決方案,比傳統的解決方案 函式和事件 更合理和更強大。原生提供了promise 物件。promise 簡單說就是乙個容器,裡面儲存著之後才執行的事件。從語法層面來說,promise 是乙個物件,從它可以獲取非同步操作的訊息。promise 提供統一的 api,...