Skip to content

Fetch 与取消:练习答案 ​

请求取消与过期结果 ​

用 AbortController 取消旧请求,用递增 sequence 守卫发布结果。输入 tea 后立即输入 coffee 时,日志允许出现 start 1 和取消记录,但只能出现 publish 2: coffee-1。网络错误进入错误状态,AbortError 不显示为业务失败。

Response 状态、Headers 与 body ​

Response(JSON.stringify({ id: 1 }), { status: 200, headers: { 'content-type': 'application/json' } }) 应返回 ok=true 和对象;404 Response 的 ok=false,但 fetch 本身不会 reject。实现应先保留 status,再按 Content-Type 选择 JSON 或 text;错误 JSON 要单独记录解析失败。

AbortSignal.timeout 与组合取消 ​

超时分支的 signal.reason.name 是 TimeoutError;用户通过 controller.abort(new DOMException('User cancelled', 'AbortError')) 时,捕获到的是 AbortError。AbortSignal.any() 保留先发生的信号原因,因此答案必须记录原因而不能只写“都是取消”。

Fetch body、克隆与消费 ​

response.clone() 必须在 json() 或 text() 之前调用。两个分支可以分别消费;原始 response 再次读取会抛出 body 已使用错误。reader 取消后要停止继续处理 chunk,但不能把已发送的服务器数据当作自动回滚。

用心记录每一步成长