?`Promise` 的狀態和方法
?1. `Promise` 的狀態
一個 `Promise` 可以處于以下三種狀態之一:
- Pending(待定):初始狀態,表示異步操作正在進行中,`Promise` 還沒有被解決或拒絕。
- Fulfilled(已完成):操作成功完成,`Promise` 已經 resolved(解決),并返回結果。
- Rejected(已拒絕):操作失敗,`Promise` 已經 rejected(拒絕),并返回錯誤原因。
這三個狀態是 `Promise` 在生命周期中會經歷的狀態,一旦狀態從 Pending 變為 Fulfilled 或 Rejected,它就不能再改變狀態。
?2. `Promise` 的方法
`Promise` 提供了一些常用的方法來處理異步操作的結果。這些方法用于設置 `Promise` 完成時的行為或處理錯誤。
1. `then(onFulfilled, onRejected)`
- `then()` 方法用于指定當 `Promise` 成功時(狀態變為 `Fulfilled`)執行的回調函數,以及當 `Promise` 失敗時(狀態變為 `Rejected`)執行的回調函數。
- `onFulfilled` 是操作成功時的回調,`onRejected` 是操作失敗時的回調。
javascript
promise.then(result => {console.log('操作成功:', result);},error => {console.log('操作失敗:', error);}
);
?
鏈式調用:
- `then()` 返回一個新的 `Promise` 對象,因此可以進行鏈式調用。鏈式調用的返回值會傳遞到下一個 `then()` 中。
javascript
promise.then(result => {return result + ' 繼續執行';}).then(newResult => {console.log(newResult); ?// '繼續執行'}).catch(error => {console.log(error);});
?
?2. `catch(onRejected)`
- `catch()` 方法是專門用來處理 `Promise` 被拒絕(即狀態為 `Rejected`)時的回調。它實際上是 `.then(null, onRejected)` 的簡寫。
javascript
promise.then(result => {console.log(result);}).catch(error => {console.error('操作失敗:', error);});
?
?3. `finally(onFinally)`
- `finally()` 方法用于在 `Promise` 執行完畢后,無論成功還是失敗,都會執行 `onFinally` 回調函數。`finally` 返回的 `Promise` 對象會繼承原 `Promise` 的狀態。
javascript
promise.then(result => {console.log('成功:', result);}).catch(error => {console.log('失敗:', error);}).finally(() => {console.log('無論成功或失敗都會執行');});
?
?4. `Promise.resolve(value)`
- `Promise.resolve(value)` 方法返回一個已經 `fulfilled` 狀態的 `Promise`,并且返回 `value` 作為結果。
- 如果傳入的是一個 `Promise` 對象,則返回該 `Promise` 對象。
javascript
let resolvedPromise = Promise.resolve('成功');
resolvedPromise.then(result => {console.log(result); ?// '成功'
});
?
5. `Promise.reject(reason)`
- `Promise.reject(reason)` 方法返回一個已經 `rejected` 狀態的 `Promise`,并且返回 `reason` 作為拒絕的原因。
javascript
let rejectedPromise = Promise.reject('失敗');
rejectedPromise.catch(error => {console.log(error); ?// '失敗'
});
6. `Promise.all(iterable)`
- `Promise.all()` 方法接收一個可迭代對象(例如數組),并返回一個新的 `Promise`。該 `Promise` 會等到所有的 `Promise` 都完成時才會被 `fulfilled`,或者當其中一個 `Promise` 被 `rejected` 時就被 `rejected`。
- 該方法適用于需要并行執行多個異步操作,并等待它們全部完成的場景。
javascript
let promise1 = Promise.resolve(1);
let promise2 = Promise.resolve(2);
let promise3 = Promise.resolve(3);Promise.all([promise1, promise2, promise3]).then(results => {console.log(results); ?// [1, 2, 3]}).catch(error => {console.error(error);});
?
?7. `Promise.race(iterable)`
- `Promise.race()` 方法接收一個可迭代對象(例如數組),并返回一個新的 `Promise`。該 `Promise` 在第一個 `Promise` 完成(無論是 `fulfilled` 還是 `rejected`)時就會結束,不再等待其他 `Promise` 完成。
javascript
let promise1 = new Promise(resolve => setTimeout(resolve, 100, 'A'));
let promise2 = new Promise(resolve => setTimeout(resolve, 200, 'B'));Promise.race([promise1, promise2]).then(result => {console.log(result); ?// 'A' (第一個完成的 Promise)});
?
?3. 總結
- `then()`:用于處理成功和失敗的回調,支持鏈式調用。
- `catch()`:用于處理 `Promise` 被拒絕時的回調,簡化錯誤處理。
- `finally()`:無論成功或失敗都執行的回調,用于執行清理操作。
- `Promise.resolve()`:用于返回一個已解決的 `Promise`。
- `Promise.reject()`:用于返回一個已拒絕的 `Promise`。
- `Promise.all()`:用于并行執行多個異步操作,所有操作完成后才會返回。
- `Promise.race()`:用于返回第一個完成的異步操作。
這些方法幫助我們更優雅地處理異步操作,避免回調地獄,并簡化錯誤處理。