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.abortedfalse 即使请求已中止:

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 确实遵循控制器的中止信号。