Promise是ES6新增的一個(gè)內(nèi)置類
- 通過new Promise() 我們可以得到一個(gè)Promise實(shí)例,實(shí)例有兩個(gè)屬性
-
PromiseStatus(狀態(tài)):
- 待定(pending): 初始狀態(tài),既沒有被兌現(xiàn),也沒有被拒絕。
- 已兌現(xiàn)(fulfilled): 意味著操作成功完成。
- 已拒絕(rejected): 意味著操作失敗。
-
PromiseValue
- 存放的是Promise的值
-
PromiseStatus(狀態(tài)):
new Promise的時(shí)候可以傳一個(gè)executor函數(shù)(可執(zhí)行函數(shù)),執(zhí)行new Promise的時(shí)候會(huì)立刻把它執(zhí)行,函數(shù)有兩個(gè)參數(shù),分別是resolve/reject,這兩個(gè)參數(shù)都是函數(shù),可以在 executor 執(zhí)行的時(shí)候使用,執(zhí)行后分別把Promise實(shí)例的狀態(tài)值改為resolved/rejected,方法傳的參數(shù)則為實(shí)例的Value值
我們所說的Promise的異步指的是resolve/rejected執(zhí)行
- 執(zhí)行兩個(gè)方法(其中一個(gè))的時(shí)候不僅僅是修改狀態(tài)和值,還要通知then存儲(chǔ)的兩個(gè)回調(diào)函數(shù)中的一個(gè)執(zhí)行
Promise的then鏈機(jī)制:
then()中,放兩個(gè)回調(diào)函數(shù),如果實(shí)例的狀態(tài)是resolved,則把第一個(gè)方法執(zhí)行,如果是rejected則把第二個(gè)方法執(zhí)行,參數(shù)為使用resolve/reject方法時(shí)傳的參數(shù)。
.then返回的是一個(gè)promise實(shí)例,return的值作為下一個(gè).then時(shí)resolove的參數(shù),.then不論是哪個(gè)回調(diào)函數(shù)執(zhí)行,只要執(zhí)行不報(bào)錯(cuò),返回的promise實(shí)例狀態(tài)都為resolove,除非return了一個(gè)new promise 此時(shí)以return的promise實(shí)例為主
then鏈的順延機(jī)制:如果狀態(tài)一但確定,想去執(zhí)行.then注入的某個(gè)方法,但是此方法沒有被注冊(cè),則向下順延(找下一個(gè)then中注冊(cè)的對(duì)應(yīng)方法)
Promse.all/Promise.race
- 返回一個(gè)的新的promise實(shí)例
- all等待所有promise實(shí)例都是成功,整體返回的實(shí)例才是成功(都對(duì)整體才是對(duì),只要有一個(gè)假,整體就是假)
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values);
});
// expected output: Array [3, 42, "foo"]
- race等待最新有返回結(jié)果的promise實(shí)例,此實(shí)例的成功和失敗決定最后的成功和失?。ㄙ惻埽赫l快聽誰的)
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one');
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'two');
});
Promise.race([promise1, promise2]).then((value) => {
console.log(value);
// Both resolve, but promise2 is faster
});
// expected output: "two"
async、await是Promise的一個(gè)語法糖:
- 我們可以將await關(guān)鍵字后面執(zhí)行的代碼,看做是包裹在(resolve, reject) => {函數(shù)執(zhí)行}中的代碼;
- await的下一條語句,可以看做是then(res => {函數(shù)執(zhí)行})中的代碼;