Fetch API 中的请求信号 属性
Request signal property in Fetch API
在参考资料中可以看到,Request
实例有signal
属性:
request . signal
Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has been aborted, and its abort event handler.
此代码段显示 req.signal.aborted
是 false
即使请求已中止:
let req = new Request('/');
req.signal.onabort = () => console.log('abort'); // no output
let ctrl = new AbortController();
fetch(req, { signal: ctrl.signal })
.catch(() => console.log(req.signal.aborted)); // outputs false
ctrl.abort();
结果与模拟连接问题相同(net::ERR_INTERNET_DISCONNECTED
)。
默认 req.signal
暴露的实际原因是什么?重新分配 req.signal
后请求的行为是否会有所不同?
req.signal
请求信号如何中止,即触发onabort
回调并将req.signal
设置为true
?
我对原生 Fetch API 实现的内部工作方式很感兴趣,没有需要解决的特定代码问题。
This snippet shows that req.signal.aborted
is false even after a request has been aborted.
是的。那是因为不是 req
是中止的请求,而是 fetch()
.
内部构造的请求
改为写
let ctrl = new AbortController();
let req = new Request('/', { signal: ctrl.signal });
req.signal.onabort = () => console.log('abort'); // will log
fetch(req).catch(() => console.log(req.signal.aborted)); // outputs true
ctrl.abort();
此处使用 new Request
构造函数创建的 req.signal
确实遵循控制器的中止信号。
在参考资料中可以看到,Request
实例有signal
属性:
request . signal
Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has been aborted, and its abort event handler.
此代码段显示 req.signal.aborted
是 false
即使请求已中止:
let req = new Request('/');
req.signal.onabort = () => console.log('abort'); // no output
let ctrl = new AbortController();
fetch(req, { signal: ctrl.signal })
.catch(() => console.log(req.signal.aborted)); // outputs false
ctrl.abort();
结果与模拟连接问题相同(net::ERR_INTERNET_DISCONNECTED
)。
默认 req.signal
暴露的实际原因是什么?重新分配 req.signal
后请求的行为是否会有所不同?
req.signal
请求信号如何中止,即触发onabort
回调并将req.signal
设置为true
?
我对原生 Fetch API 实现的内部工作方式很感兴趣,没有需要解决的特定代码问题。
This snippet shows that
req.signal.aborted
is false even after a request has been aborted.
是的。那是因为不是 req
是中止的请求,而是 fetch()
.
改为写
let ctrl = new AbortController();
let req = new Request('/', { signal: ctrl.signal });
req.signal.onabort = () => console.log('abort'); // will log
fetch(req).catch(() => console.log(req.signal.aborted)); // outputs true
ctrl.abort();
此处使用 new Request
构造函数创建的 req.signal
确实遵循控制器的中止信号。