取消
取消要求
在 axios 呼叫中設定 timeout
屬性可處理與回應相關的逾時。
在某些情況下(例如網路連線不可用),axios 呼叫會受益於提早取消連線。如果沒有取消,axios 呼叫可能會暫停,直到父程式碼/堆疊逾時(在伺服器端應用程式中可能需要幾分鐘)。
若要終止 axios 呼叫,可以使用下列方法
訊號
cancelToken
(已棄用)
結合 timeout
和取消方法(例如 signal
)應涵蓋與回應相關的逾時和與連線相關的逾時。
signal
:中斷控制器
從 v0.22.0
開始,Axios 支援 AbortController
以 fetch API 方式取消要求
const controller = new AbortController();
axios.get('/foo/bar', {
signal: controller.signal
}).then(function(response) {
//...
});
// cancel the request
controller.abort()
使用最新 AbortSignal.timeout()
API 的逾時範例 [nodejs 17.3+]
axios.get('/foo/bar', {
signal: AbortSignal.timeout(5000) //Aborts request after 5 seconds
}).then(function(response) {
//...
});
使用逾時輔助函式的範例
function newAbortSignal(timeoutMs) {
const abortController = new AbortController();
setTimeout(() => abortController.abort(), timeoutMs || 0);
return abortController.signal;
}
axios.get('/foo/bar', {
signal: newAbortSignal(5000) //Aborts request after 5 seconds
}).then(function(response) {
//...
});
CancelToken 已棄用
您也可以使用 CancelToken 取消要求。
axios 取消令牌 API 基於已撤回的 可取消承諾提案。
此 API 自
v0.22.0
起已棄用,不應在新的專案中使用
您可以使用 CancelToken.source
工廠建立取消令牌,如下所示
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get('/user/12345', {
cancelToken: source.token
}).catch(function (thrown) {
if (axios.isCancel(thrown)) {
console.log('Request canceled', thrown.message);
} else {
// handle error
}
});
axios.post('/user/12345', {
name: 'new name'
}, {
cancelToken: source.token
})
// cancel the request (the message parameter is optional)
source.cancel('Operation canceled by the user.');
您也可以透過將執行器函式傳遞給 CancelToken
建構函式來建立取消令牌
const CancelToken = axios.CancelToken;
let cancel;
axios.get('/user/12345', {
cancelToken: new CancelToken(function executor(c) {
// An executor function receives a cancel function as a parameter
cancel = c;
})
});
// cancel the request
cancel();
注意:您可以使用相同的取消令牌/訊號取消多個要求。
在過渡期間,您可以在同一個要求中使用兩種取消 API
const controller = new AbortController();
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get('/user/12345', {
cancelToken: source.token,
signal: controller.signal
}).catch(function (thrown) {
if (axios.isCancel(thrown)) {
console.log('Request canceled', thrown.message);
} else {
// handle error
}
});
axios.post('/user/12345', {
name: 'new name'
}, {
cancelToken: source.token
})
// cancel the request (the message parameter is optional)
source.cancel('Operation canceled by the user.');
// OR
controller.abort(); // the message parameter is not supported