我了解使用 AbortSignal 取消正在進行的請求的作業流程,即將其傳遞給選項:
const res = await fetch('/endpoint', { signal });
const data = await res.json();
然而,如果信號被取消發生了什么之后請求本身已經完成,但之前的資料已經被決議?像這樣:
const res = await fetch('/endpoint', { signal });
// Cancel signal here
const data = await res.json();
我在 Firefox、Chrome 和 Safari 中的測驗表明它會被正確取消并在此期間拋出res.json(),但這是官方行為嗎?
const log = (...text) => document.body.insertAdjacentHTML('beforeend', `${text.join(' ')}<br />`);
(async () => {
try {
const controller = new AbortController();
const signal = controller.signal;
const res = await fetch('https://swapi.dev/api/films/2/', { signal });
log('Request:', signal.aborted);
controller.abort();
log('Before:', signal.aborted);
const data = await res.json();
log('After:', signal.aborted);
} catch (error) {
log('Cancelled:', error.name);
}
})();
// Request: false
// Before: true
// Cancelled: AbortError
從輸出中我們可以看到它正確地拋出res.json(),它永遠不會到達After步驟,并且它被拋出一個AbortError。
uj5u.com熱心網友回復:
是的,這是官方行為。json()(和朋友)消耗回應的主體。根據https://fetch.spec.whatwg.org/#dom-global-fetch 的第 10 步,該主體可能會因信號而處于中止狀態。在這種情況下,json()(和朋友)基本上會重新拋出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/376849.html
標籤:javascript 例外 异步等待 获取-api
