javascript - 使用 ReadableStream 和 Response 从 Service Worker 的 fetch 事件中返回 HTML
问题描述
我正在尝试HTML
在服务人员中为响应返回一个流,但浏览器似乎无法解析它(我正在使用 chrome 进行此测试)。
所以,这个有效(在fetch
事件中):
event.respondWith(new Response("<h1>Yellow!</h1>", { headers: { "Content-Type": "text/html" }}))
但是当我使用它时ReadableStream
,它不再在浏览器中呈现:
const stream = new ReadableStream({
start(controller) {
controller.enqueue("<h1>Yellow!</h1>")
controller.close()
}
})
event.respondWith(new Response(stream, { headers: { "Content-Type": "text/html" }}))
似乎浏览器可能不明白我正在向它发送流。但我不知道我需要使用什么标题,所以上述方法有效。
我用过的资源:
https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream#Examples
https://philipwalton.com/articles/smaller-html-payloads-with-service-workers/
更新
解决方案
由于某种原因,当您不使用ReadableStream.getReader锁定流时,它不起作用
此外,当您传递ReadableStream
给Response
ctor时,Response.text方法不会处理流,而是返回toString()
一个对象。
const createStream = () => new ReadableStream({
start(controller) {
controller.enqueue("<h1 style=\"background: yellow;\">Yellow!</h1>")
controller.close()
}
})
const firstStream = createStream().getReader();
const secondStream = createStream().getReader();
new Response(firstStream, {
headers: {
"Content-Type": "text/html"
}
})
.text()
.then(text => {
console.log(text);
});
secondStream.read()
.then(({
value
}) => {
return new Response(value, {
headers: {
"Content-Type": "text/html"
}
});
})
.then(response => response.text())
.then(text => {
console.log(text);
});
推荐阅读
- node.js - 通过 PKG 安装 Node 后找不到 NPM 命令(无 brew)
- java - 注释在 Kotlin 中不起作用,错误的初始化?
- javascript - 在 HTML 文件中使用 JavaScript 在后台添加计时事件
- haskell - 将浮点数舍入到特定的小数位数
- azure - Pyspark - 获取给定视图的所有表的列表
- android - 可以在 Android ViewModel 中保存带有活动引用的复杂对象吗?
- java - 两个 Web 应用程序共享的 JAR 可以记录到 Tomcat 中的同一个文件吗?
- haskell - Haskell 中的 isPrime 函数正在生成非详尽模式错误。怎么了?
- git - 减少 git 稀疏检出的范围
- php - Mac OS X(通过 brew)和 PHP 上的 unixODBC