gpt4 book ai didi

javascript - node.js 表达 response.write() 在 Safari 中不是异步的

转载 作者:行者123 更新时间:2023-12-02 15:41:53 25 4
gpt4 key购买 nike

我有一个非常简单的 node.js 服务器,我用它来 ping 一些我需要保持在线的服务器。

使用Express我可以访问一个非常简单的端点,它将执行请求循环并报告结果。

在每个循环上使用 res.write(),我加载的网页可以向我显示正在发生的进度。

问题是,在 OS XiOS 上的 Safari 中都不会发生此进度。它会等到该过程完成,然后一次性转储整个输出。

这是我的代码示例:

router.route('/test').get(function(req, res)
{
res.write('<html><head></head><body>');
res.write('Starting tests...<br />');
performServerTests(req, res, function(results)
{ // Each loop within performServerTests also uses res.write()
res.write('<br />Complete');
res.end('</body></html>');
});
});

是否存在已知原因导致 Safari 会等待 res.end() 调用才显示其已有内容,而 Chrome 则会显示每个 res.write()收到消息时?

谢谢

最佳答案

当使用分块传输(您正在尝试执行的操作)时,浏览器通常会在开始渲染之前等待接收到最少量的数据。确切的大小是特定于浏览器的 - 请参阅 Using "transfer-encoding: chunked", how much data must be sent before browsers start rendering it?有关于此的一些最新数据点。例如,您可以这样编写(也添加一些显式 header ):

router.route('/test').get(function(req, res)
{
res.setHeader('Content-Type', 'text/html; charset=UTF-8');
res.setHeader('Transfer-Encoding', 'chunked');
res.write('<html><head></head><body>');
res.write('Starting tests...<br />');
var buf = ""
for (var i = 0; i < 500; i++) {
buf += " "
}
res.write(buf);
performServerTests(req, res, function(results)
{ // Each loop within performServerTests also uses res.write()
res.write('<br />Complete');
res.end('</body></html>');
});
});

关于javascript - node.js 表达 response.write() 在 Safari 中不是异步的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32497764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com