Why does fetch request have to be cloned in service worker?

雨燕双飞 提交于 2019-12-05 02:27:08

The comment seems to me to say quite clearly why the author of that code thought cloning was necessary:

A request is a stream and can only be consumed once. Since we are consuming this once by cache and once by the browser for fetch, we need to clone the response.

Remember that the body of a request can be a ReadableStream. If cache.match had to read the stream (or partially read the stream) to know whether a cache entry was a match, a subsequent read by fetch would continue that read, missing any data that cache.match read.

I wouldn't be surprised if it only mattered in limited situations (unless the code in the Google example is just plain wrong and it's not necessary), and so failing to do it probably works in many test cases (for instance, where the body is null or a string, not a stream). Remember that MDN is very good, but it is community-edited, and errors and poor examples do creep in periodically. (I've had to fix several blatant errors in it over the years.) Usually the community spots them and fixes them.

fetch requests, aren't cached and hence caches do not essentially consume a request

Hence, no need to clone. - asked Jake on his write up earlier.

responses however, are put or added into a cache and /or, can be passed down the then chain as JSON /text/ something else - meaning, they are / can be consumed.

My guess is, If you use or mutate something, then, you need to clone it.

A read is possibly doing neither in caches.match

I am also assuming , that possibly another reason is, the read on the request itself, is not piped down the chain, and is only read once by caches.match as in, the read only happens once, but the response stream, may be piped into other mutating/transforming/writing pipelines

Just grasping from the streams spec.. yet to decipher how everything adds up.. maybe I'll leave that to the pundits

So If I were to paraphrase my understanding till now, clone what is ideally consumed and do not bother otherwise. And in this case, the read itself, doesn't mutate the request / write it elsewhere, hence no need to clone

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!