Этот вопрос похож на мой другой вопрос , но учитывает асинхронный характер внутри ReadableStream
.
Теперь это мой тестовый код:
const stream = new ReadableStream({
start(c) {
let i = 1
const t = setInterval(test, 5e2)
function test() {
c.enqueue("<h1>Yellow!</h1>")
if (i++ === 5) {
clearInterval(t)
c.close()
}
}
}
})
event.respondWith(new Response(stream, {headers: {"content-type": "text/html"}}))
Приведенный выше код не отображается браузером, и я не знаю почему. По примерам в сети вроде должно работать. Но, похоже, он не читает ни один из элементов enqueue
.
Обратите внимание, что в моем другом вопросе ответ, по крайней мере, отображал первый ответ:
const createStream = () => new ReadableStream({
start(controller) {
controller.enqueue("<h1 style=\"background: yellow;\">Yellow!</h1>")
controller.close()
}
})
const secondStream = createStream().getReader();
secondStream.read()
.then(({
value
}) => {
return new Response(value, {
headers: {
"Content-Type": "text/html"
}
});
})
.then(response => response.text())
.then(text => {
console.log(text);
});
Что, похоже, делает смысл, поскольку он читает все сразу, независимо от того, закончился ли поток.
Ресурсы, которые я использовал:
https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream#Examples
https://philipwalton.com/articles/smaller-html-payloads-with-service-workers/