当请求状态大于400(我已尝试过400,423,429状态)时,fetch无法读取返回的json内容.浏览器控制台中显示以下错误
未捕获(承诺)TypeError:无法在'Response'上执行'json':正文流被锁定
我显示了返回的响应对象的内容,如下所示:
但几个月前我仍然可以使用它.
我的问题如下:
PS:我的浏览器版本是Google Chrome 70.0.3538.102(正式版本)(64位)
我想拦截Javascript中的fetch API请求和响应.
例如:在发送请求之前要拦截请求URL并且一旦获得响应就想拦截响应.
以下代码用于拦截所有XMLHTTPRequest的响应.
(function(open) {
XMLHttpRequest.prototype.open = function(XMLHttpRequest) {
var self = this;
this.addEventListener("readystatechange", function() {
if (this.responseText.length > 0 && this.readyState == 4 && this.responseURL.indexOf('www.google.com') >= 0) {
Object.defineProperty(self, 'response', {
get: function() { return bValue; },
set: function(newValue) { bValue = newValue; },
enumerable: true,
configurable: true
});
self.response = 'updated value' //Intercepted Value
}
}, false);
open.apply(this, arguments);
};
})(XMLHttpRequest.prototype.open);
Run Code Online (Sandbox Code Playgroud)
我想为Fetch()API实现相同的功能.
提前致谢..
我有一个元素想要作为请求的 HTML 流填充,而不是等待完整的响应。事实证明这非常困难。
\n\n我尝试过的事情:
\n\nmilestoneNode.insertAdjacentHTML(\'beforebegin\', text)如果这有效的话,那就太好了。不幸的是,具有古怪解析的元素会破坏它 \xe2\x80\x94 例如<p>和<table>。由此产生的 DOM 可以被宽容地描述为 Dada。
谷歌似乎incremental-dom最有前途,但它的patch()操作总是从容器节点的开头重新启动。不知道如何将其“冻结”到位。
这也有至少在 JavaScript 中进行 HTML 标记化的负担,并且必须进行一些实际的树构建,除非提供格式良好的 XHTML5。(没有人这样做。)重新实现浏览器的HTML 解析器似乎是我犯了严重错误的标志。
\n\ndocument.write()我很绝望。讽刺的是,这个古老的妖怪几乎具有我需要的行为,没有“扔掉现有页面”的事情。
\n\ninnerHTML定期对其进行 ing破坏了流式传输的意义,因为最终整个响应都会保存在内存中。还有重复序列化的开销。
\n\n从好的方面来看,它确实有效。但肯定有更好的方法吗?
\n