基本概念
Promise 對象有三種狀態(tài):pending瀑梗,resolved,rejected
只有異步操作的結果,可以決定當前是哪一種狀態(tài)卵沉,任何其他操作都無法改變這個狀態(tài)
一旦狀態(tài)改變涉波,就不會再變珠闰,任何時候都可以得到這個結果
Promise 對象的狀態(tài)改變咬崔,只有兩種可能:從 pending 變?yōu)?fulfilled 狸棍,從 pending 變?yōu)?rejected
Promise.prototype.catch()
Promise.prototype.catch 方法是 .then(null, rejection) 的別名鉴扫,用于指定發(fā)生錯誤時的回調函數
p.then(() => {})
.catch(() => {});
// 等同于
p.then(() => {})
.then(null, () => {});
Promise 內部的錯誤不會影響到 Promise 外部的代碼
p = new Promise((resolve, reject) => {
resolve(x + 1)
})
p.then(() => console.log(11))
setTimeout(() => { console.log(123) }, 2000);
// Uncaught (in promise) ReferenceError: x is not defined
// 123
Promise.prototype.finally()
用于指定不管 Promise 對象最后狀態(tài)如何赞枕,都會執(zhí)行的操作
其實是個語法糖:
promise.finally(() => {
// 語句
});
// 等同于
promise.then(
result => {
// 語句
return result;
},
error => {
// 語句
throw error;
}
);
Promise.all()
用于將多個 Promise 實例,包裝成一個新的 Promise 實例,參數需要具有 Iterator 接口
const p = Promise.all([p1, p2, p3]);
p 的狀態(tài)由 p1炕婶、p2姐赡、p3 決定,分成兩種情況:
(1)只有 p1柠掂、p2项滑、p3 的狀態(tài)都變成 fulfilled,p的狀態(tài)才會變成 fulfilled陪踩,此時p1杖们、p2、p3的返回值組成一個數組肩狂,傳遞給p的回調函數摘完。
(2)只要 p1、p2傻谁、p3 之中有一個被 rejected孝治,p的狀態(tài)就變成 rejected,此時第一個被 reject 的實例的返回值审磁,會傳遞給p的回調函數谈飒。
Promise.race()
將多個 Promise 實例,包裝成一個新的 Promise 實例
const p = Promise.race([p1, p2, p3]);
上面代碼中态蒂,只要 p1杭措、p2、p3 之中有一個實例率先改變狀態(tài)钾恢,p 的狀態(tài)就跟著改變手素。那個率先改變的 Promise 實例的返回值,就傳遞給 p 的回調函數
Promise.resolve()
作用:將現(xiàn)有對象轉為 promise 對象
Promise.resolve 等價于下面的寫法
Promise.resolve('foo')
// 等價于
new Promise(resolve => resolve('foo'))
如果參數是 promise 實例瘩蚪,那么 Promise.resolve 將原封不動地返回這個實例泉懦。
注意:立即 resolve 的 Promise 對象,是在本輪“事件循環(huán)”(event loop)的結束時疹瘦,而不是在下一輪“事件循環(huán)”的開始時崩哩。
setTimeout(function () {
console.log('three');
}, 0);
Promise.resolve().then(function () {
console.log('two');
});
console.log('one');
// one
// two
// three
Promise.reject()
作用:返回一個新的 Promise 實例,該實例的狀態(tài)為 rejected
const p = Promise.reject('出錯了');
// 等同于
const p = new Promise((resolve, reject) => reject('出錯了'))
p.then(null, function (s) {
console.log(s)
});
// 出錯了
注意:Promise.reject() 方法的參數言沐,會原封不動地作為 reject 的理由邓嘹,變成后續(xù)方法的參數。這一點與 Promise.resolve 方法不一致险胰。
Promise.try()
Promise.try(database.users.get({id: userId}))
.then(...)
.catch(...)
給同步和異步提供統(tǒng)一的錯誤處理
其它
new Promise(() => { })
吴超,這條語句執(zhí)行后,傳入的函數就會執(zhí)行鸯乃。