一.Promise是異步編程的一種解決方案,它是一個容器,里面保存着某個未來才會結束的事件(通常是一個異步操作)的結果。從語法上說,Promise 是一個對象,從它可以獲取異步操作的消息。Promise 提供統一的 API,各種異步操作都可以用同樣的方法進行處理。promise對象是一個構造函數,用來生成Promise實例;
二.promise的兩個特點 對象狀態不受外界影響 && 一旦狀態改變,就不會再變,任何時候都可以得到結果(pending狀態-->fulfilled || pending-->rejected)
基本用法 函數作為參數,該函數兩個參數resolve和reject
const promise = new Promise(function(resolve,reject) { ... if(/*異步操作成功*/){ resolve(value) }else{ reject(error) } })
三.Promise方法
1.promise.prototype.then():Promise 實例添加狀態改變時的回調函數,有兩個參數resolve和reject的分別操作
一般來說,調用resolve
或reject
以后,Promise 的使命就完成了,后繼操作應該放到then
方法里面,而不應該直接寫在resolve
或reject
的后面。所以,最好在它們前面加上return
語句,這樣就不會有意外。
new Promise((resolve, reject) => { return resolve() //后面語句不會執行 console.log('dd') })
2.promise.prorotype.catch():是.then(null, rejection)
的別名,用於指定發生錯誤時的回調函數。
getJSON('/posts.json').then(function(posts) { // ... }).catch(function(error) { // 處理 getJSON 和 前一個回調函數運行時發生的錯誤 console.log('發生錯誤!', error); });
建議總是使用catch
方法,而不使用then
方法的第二個參數
// bad promise .then(function(data) { // success }, function(err) { // error }); // good promise .then(function(data) { //cb // success }) .catch(function(err) { // error });
如果沒有使用catch
方法指定錯誤處理的回調函數,Promise 對象拋出的錯誤不會傳遞到外層代碼,即不會有任何反應。一般總是建議,Promise 對象后面要跟catch
方法,這樣可以處理 Promise 內部發生的錯誤。catch
方法返回的還是一個 Promise 對象,因此后面還可以接着調用then
方法。
3.promise.prototype.finally():用於指定不管 Promise 對象最后狀態如何,都會執行的操作。該方法是 ES2018 引入標准的。
promise .then(result => {···}) .catch(error => {···}) .finally(() => {···});
4.promise.all():用於將多個 Promise 實例,包裝成一個新的 Promise 實例。
promises
是包含 n 個 Promise 實例,只有這n 個實例的狀態都變成fulfilled
,或者其中有一個變為rejected
,才會調用Promise.all
方法后面的回調函數。
5.promise.race()同樣是將多個 Promise 實例,包裝成一個新的 Promise 實例。
6.promise.resolve()將現有對象轉為 Promise 對象,Promise.resolve
方法就起到這個作用
7.promise.reject()也會返回一個新的 Promise 實例,該實例的狀態為rejected
。
8.promise.try()
Promise.try(database.users.get({id: userId})) .then(...) .catch(...)
參考 https://segmentfault.com/a/1190000010399626 執行順序有介紹
參考 http://web.jobbole.com/91406/ promise原理 實現