Promise對象用于表示一個異步操作的最終完成(或失敗)及其結(jié)果值骤坐。
Promise對象的幾種狀態(tài):
- 待定(pending):初始狀態(tài)绪杏,即沒有被兌現(xiàn),也沒有被拒絕纽绍。
- 已兌現(xiàn)(fulfilled):表示操作成功蕾久、完成。
- 已拒絕(rejected):表示操作失敗拌夏。
- 已敲定(settled):如果一個 promise 已經(jīng)被兌現(xiàn)(fulfilled)或被拒絕(rejected)僧著,那么也可以說它處于已敲定(settled)狀態(tài)履因。
鏈?zhǔn)秸{(diào)用
promise可以使用promise.then((onFulfilled, onRejected)、promise.catch(onRejected)和 promise.finally(onFinally)進行鏈?zhǔn)秸{(diào)用盹愚,這些實例方法都會返回一個新的promise對象栅迄。這個promise對象的狀態(tài),由這些實例方法的參數(shù)(onFulfilled\onRejected\onFinally)的返回值決定:
兩種情況返回的promise對象狀態(tài)為已拒絕杯拐。第一種情況在函數(shù)中拋出異常霞篡;第二種情況是返回一個已拒絕的promise對象,此時返回的promise對象替換這些實例方法返回的對象端逼。除了這兩種情況朗兵,這些實例方法返回的promise對象都為已兌現(xiàn)狀態(tài)。
所有promise都是異步的
處于已敲定狀態(tài)的promise對象也可以接收操作顶滩,因此在完成異步操作和綁定處理方法之間不會存在競爭狀態(tài)余掖。需要注意的是所有的 promise 都一定是異步的。因此礁鲁,一個已經(jīng)處于"已敲定"("settled")狀態(tài)的 promise 中的操作只有 promise 鏈?zhǔn)秸{(diào)用的棧被清空了和一個事件循環(huán)過去了之后才會被執(zhí)行盐欺。
const promiseA = new Promise( (resolutionFunc,rejectionFunc) => {
resolutionFunc(777);
});
// 這時,"promiseA" 已經(jīng)被敲定了仅醇。
promiseA.then( (val) => console.log("asynchronous logging has val:",val) );
console.log("immediate logging");
// produces output in this order:
// immediate logging
// asynchronous logging has val: 777