提问者:小点点

Node. js在Safari中不异步表达response.write()


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

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

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

问题是,这个进程不会在Safari中发生在OSXiOS上。它等到过程完成,然后一次转储整个输出。

这是我的代码示例:

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()消息时显示它?

谢啦


共1个答案

匿名用户

当使用分块传输(你正在尝试做的)时,浏览器通常会在开始渲染之前等待接收到最少的数据量。确切的大小是浏览器特定的-请参阅使用“传输编码:分块”,在浏览器开始渲染之前必须发送多少数据?关于这方面的一些最近的数据点。例如,您的示例可以这样写(添加一些标头也很显式):

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>');
    });
});