promise對象能夠獲取異步操做的消息,提供統一的API,各個異步操做均可以用一樣的方法進行處理。
promise對象不受外界影響,其有三種狀態:pending(進行中)、fulfilled(成功)、rejected(失敗),只有異步操做的結果能夠決定當前狀態,一旦狀態改變就不能夠再變化,狀態改變方向有兩種:pending -> fulfilled、pending -> rejected
promise對象的意義就在於將異步操做以同步操做的流程表達,避免層層嵌套的回調函數javascript
let promise = new Promise(function (resolve, reject) { if () { resolve(value) // 異步操做成功 } else { reject(error) // 失敗拋錯 } })
Promise構造函數接受一個函數做爲參數,該函數有兩個參數:resolve、reject,當執行resolve函數時Promise對象狀態pending -> fulfilled,當執行reject時Promise對象狀態pending -> rejectedjava
promise.then(function (value) { }, function (error) { })
Promise實例生成之後,能夠用then方法分別指定resolved狀態和rejected狀態的回調函數,第二個參數爲可選參數,例子:數組
let promise = new Promise(function (resolve, reject) { console.log('promise') resolve('11') }) promise.then(function (value) { console.log(value) }) console.log('22')
執行結果'promise -> 22 -> 11',promise對象新建後當即執行,then方法的回調會在全部同步任務執行完成後執行promise
promise.prototype.catch()是then()方法的別名,用於指定發生錯誤時的回調函數異步
new Promise(function () { }).then(() => { }).catch(err => { console.log(err) })
若是異步操做拋出錯誤,狀態就會變爲reject,就會調用catch中的回調,當狀態爲resolve,執行then方法中的回調時,若報錯一樣回進入catch的回調
意義:當咱們使用promise異步操做時,可是沒有使用catch捕獲錯誤時,若promise異步執行報錯時,外部代碼並不會接收到錯誤,而是繼續執行不受影響函數
const someAsyncThing = function() { return new Promise(function(resolve, reject) { resolve(x); }); }; someAsyncThing().then(function() { console.log('ok'); }); setTimeout(() => { console.log('continue') }, 100);
如代碼所示,x變量並無定義,期待的操做是執行報錯,而後中止運行,實際上‘continue’會執行輸出,這說明當沒有catch捕獲錯誤時,外部代碼不會知道Promise對象內部執行已經報錯,所以會繼續執行。prototype
無論Promise對象最後結果如何,都會執行的操做,finally方法中的回調函數不接受任何參數code
promise .then(result => {···}) .catch(error => {···}) .finally(() => {···});
Promise.all方法用於將多個Promise實例包裝成一個新的實例對象
Promise.all([p1,p2,p3]).then((array) => { }).catch((err) => { })
只有p一、p二、p3的狀態都變成fulfilled,p的狀態纔會變成fulfilled,此時p一、p二、p3的返回值組成一個數組,傳遞給p的回調函數。
只要p一、p二、p3之中有一個被rejected,p的狀態就變成rejected,此時第一個被reject的實例的返回值,會傳遞給p的回調函數。ip