我的理解就是使用同步編程的寫法完成異步編程操做。
const promise = new Promise((resolve, reject) => { //some asynchronous code setTimeout(() => { console.log('執行完成'); resolve('some data'); }, 2000); });
Promise
接收一個函數做爲參數,函數有兩個參數,resolve
和 reject
分別表示異步操做執行後成功的回調函數和失敗的回調函數。 html
Promise
實例後立刻執行。因此一般採用一個函數包含它git
function runAsync() { return new Promise((resolve, reject) => { //some asynchronous code setTimeout(() => { console.log('執行完成'); resolve('some data'); }, 2000); }); } runAsync().then((data) => { console.log(data);//可使用異步操做中的數據 })
runAsync()
執行完調用 then
方法,then()
就至關於咱們以前寫的回調函數。github
function paramTest(){ return new Promise((resolve, reject) => { let number = Math.ceil(Math.random() * 10); if (number < 5) { resolve(number); }else{ reject('out of range'); } }) } paramTest().then((number) => { console.log('resolved'); console.log(number); },(reason) => { console.log('rejected'); console.log(reason); })
Promise
有三種狀態:pending
(進行中)、fulfilled
(已成功)和 rejected
(已失敗)編程
paramTest()
例子有兩種狀況:數組
number < 5
時,咱們認爲是成功狀況,將狀態從 pending
變爲 fulfilled
number >= 5
時,咱們認爲是失敗狀況,將狀態從 pending
變爲 rejected
因此
paramTest()
的執行結果:
fulfilled | rejected |
---|---|
resolved | rejected |
number | out of range |
咱們繼續調用
paramTest
方法舉例
paramTest().then((number) => { console.log('resolved'); console.log(number); console.log(data); //data爲未定義 },(reason) => { console.log('rejected'); console.log(reason); }).catch((err) => { console.log(err); })
catch
方法其實就是 .then(null, rejection)
的別名,也是用來處理失敗失敗的回調函數,可是還有一個做用:當 resolve
回調中若是出現錯誤了,不會堵塞,會執行 catch
中的回調。promise
const p = Promise.all([p1, p2, p3]); p.then(result => { console.log(result); })
all
方法接收一個數組參數,數組中每一項返回的都是Promise
對象,只有當p1, p2, p3
都執行完纔會進入then
回調。p1, p2, p3
返回的數據會以一個數組的形式傳到then
回調中。
const p1 = new Promise((resolve, reject) => { setTimeout(() => { resolve('p1'); }, 1000); }) .then(result => result) .catch(e => e); const p2 = new Promise((resolve, reject) => { setTimeout(() => { resolve('p2'); }, 3000); }) .then(result => result) .catch(e => e); Promise.all([p1, p2]) .then(result => console.log(result)) .catch(e => console.log(e)); //3秒後輸出['p1', 'p2']
const p = Promise.race([p1, p2, p3]); p.then(result => { console.log(result); })
race
的用法與all
一模一樣,不一樣的是all
方法須要參數的每一項都返回成功了纔會執行then
;而race
則是隻要參數中的某一項返回成功就執行then
回調。如下是
race
的例子,和all
方法對比,能夠看到返回值有很明顯的區別。dom
const p1 = new Promise((resolve, reject) => { setTimeout(() => { resolve('p1'); }, 1000); }) .then(result => result) .catch(e => e); const p2 = new Promise((resolve, reject) => { setTimeout(() => { resolve('p2'); }, 3000); }) .then(result => result) .catch(e => e); Promise.race([p1, p2]) .then(result => console.log(result)) .catch(e => console.log(e)); //1秒後輸出 'p1'
點擊這裏查看本文中實例源代碼異步
resloader是基於Promise實現的一個圖片預加載並展現加載進度的插件,猛戳這裏瞭解詳情。若是感受還能夠的話,歡迎starasync