node.js 表示 response.write() 在 Safari 中不是异步的
node.js express response.write() not async in Safari
我有一个非常简单的 node.js
服务器,我用它来 ping 一些我需要保持在线的服务器。
使用 Express 我有一个非常简单的端点,我可以访问它将执行请求循环并报告结果。
在每个循环中使用 res.write()
,我加载的网页可以显示正在发生的进度。
问题是,在 OS X
或 iOS
的 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()
消息时显示它,这有什么已知的原因吗?
谢谢
当使用分块传输(您正在尝试执行的操作)时,浏览器通常会在开始呈现之前等待接收到最少量的数据。确切的大小是 browser-specific - 请参阅 Using "transfer-encoding: chunked", how much data must be sent before browsers start rendering it? 了解一些最近的数据点。
你的例子可以这样写(添加一些 headers 也很明确):
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>');
});
});
我有一个非常简单的 node.js
服务器,我用它来 ping 一些我需要保持在线的服务器。
使用 Express 我有一个非常简单的端点,我可以访问它将执行请求循环并报告结果。
在每个循环中使用 res.write()
,我加载的网页可以显示正在发生的进度。
问题是,在 OS X
或 iOS
的 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()
消息时显示它,这有什么已知的原因吗?
谢谢
当使用分块传输(您正在尝试执行的操作)时,浏览器通常会在开始呈现之前等待接收到最少量的数据。确切的大小是 browser-specific - 请参阅 Using "transfer-encoding: chunked", how much data must be sent before browsers start rendering it? 了解一些最近的数据点。 你的例子可以这样写(添加一些 headers 也很明确):
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>');
});
});