Axios 攔截器的工作原理基於鏈式呼叫和Promise。它允許你在請求傳送前和響應返回後對請求和響應進行攔截和處理。 可以理解為一個“中介軟體”機制。
具體來說,Axios 攔截器分為兩種:
- 請求攔截器 (Request Interceptors): 在請求傳送之前執行。可以用於修改請求配置 (例如新增 headers、修改 data),或根據條件取消請求。
- 響應攔截器 (Response Interceptors): 在收到響應之後執行。可以用於處理響應資料 (例如資料轉換、錯誤處理),或根據響應狀態碼進行重定向。
工作流程:
-
註冊攔截器: 使用
axios.interceptors.request.use()
註冊請求攔截器,使用axios.interceptors.response.use()
註冊響應攔截器。這兩個方法都接受兩個引數:fulfilled
回撥函式:請求/響應成功時觸發。rejected
回撥函式:請求/響應失敗時觸發 (例如網路錯誤、超時)。
-
鏈式呼叫: 多個攔截器可以被註冊,它們會按照註冊順序依次執行,形成一個鏈條。對於請求攔截器,鏈條的末端是實際的網路請求;對於響應攔截器,鏈條的末端是將響應資料返回給呼叫者。
-
Promise 處理: 攔截器內部使用 Promise 來處理非同步操作。
fulfilled
回撥函式必須返回一個值 (可以是修改後的 config 或 response),或者是一個 Promise。這個返回值會被傳遞給鏈條中的下一個攔截器。如果fulfilled
回撥函式丟擲錯誤,或者返回一個 rejected 的 Promise,則會觸發rejected
回撥函式。 -
錯誤處理:
rejected
回撥函式用於處理錯誤。它也必須返回一個值或 Promise,或者丟擲一個錯誤。如果rejected
回撥函式返回一個值或 resolved 的 Promise,則錯誤會被“消化”,鏈條會繼續執行,但後續的fulfilled
回撥函式會收到這個返回值。如果rejected
回撥函式丟擲錯誤或返回 rejected 的 Promise,則錯誤會繼續向上傳遞,最終被catch
捕獲。
示例:
// 請求攔截器
axios.interceptors.request.use(
config => {
// 在傳送請求之前新增 token
config.headers.Authorization = 'Bearer ' + localStorage.getItem('token');
return config;
},
error => {
// 處理請求錯誤
return Promise.reject(error);
}
);
// 響應攔截器
axios.interceptors.response.use(
response => {
// 處理響應資料
return response.data;
},
error => {
// 處理響應錯誤,例如 token 過期
if (error.response.status === 401) {
// 重定向到登入頁面
window.location.href = '/login';
}
return Promise.reject(error);
}
);
總結:
Axios 攔截器透過鏈式呼叫和 Promise 提供了一種靈活的機制,可以在不修改核心業務邏輯的情況下,對請求和響應進行預處理和後處理,例如新增認證資訊、處理錯誤、轉換資料等,從而提高程式碼的可維護性和複用性。