node.js - bigpipe 仍然按照最长的时间响应数据
大家讲道理
大家讲道理 2017-04-17 14:00:15
[Node.js讨论组]

如图 客户端页面 需要这两个接口的数据

我这块分别 获取到这两个数据之后
nodejs:
接口一完成
res.write(data1);

接口二完成
res.write(data2)
结束;
但是客户端看到的页面 还是等到了 最后这个接口完成的时候 数据才渲染出来。
请教下 问题出在那里?

其实 接收到数据后 就 执行了js的一个方法, 类似 innerHTML

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(2)
天蓬老师

res.write数据后,需要调用res.end方法。服务端才能认为数据已经写入完毕,客户端才会收到写入完毕的信号,数据才能读取出来。
前面七七八八相当然的回答了一下,sorry
借用搜到的例子,运行了一下代码
注意[KEYCODE]处的代码,要保证要显示的主页面要大些,大于1K?不确定,反正要大些
似乎是浏览器的缓存的问题,
当发现响应头有Transfer-Encoding:chunked,没有Content-Length头时(2者不能并存),发现收到的内容小于某个设定的值时,继续等待后续的内容,而不马上解析处理。
firefox,safari采用上面的方式处理~~
Chrome却很积极的,收到内容马上处理~~~

var http = require('http');
var url = require("url");

var http = require('http');

var  server = http.createServer(function(req, response){
    var delay = Math.round(Math.random() * 8000);
    console.log('get request'+req.url);
    setTimeout(function() {
        var params = url.parse(req.url, true);
        var id = params.query.id;
        response.writeHead(200, {"Content-Type" : "text/html"});
        var content = "<span>Content of Module " + new Date().getTime() + "</span>";
        response.write('<script>arrived("' + id + '", "' + content + '");</script>');
        response.end();
    }, delay);
});
server.on('clientError', function(err, socket){
    socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});
server.listen(8000);


http.createServer(function(request, response) {
    response.writeHead(200, {
        "Content-Type" : "text/html"
    });
    response.write("<!Doctype html><html><head>");
    response.write('<style type="text/css">p{border:2px solid #4F81BD; margin:30px; padding: 10px;}</style>');
    response.write('<script type="text/javascript">function arrived(id,text) { var b=document.getElementById(id); b.innerHTML = text; }</script>');
    response.write("</head><body><p>Progressive Loading");
    
    //[KEYCODE] 第1次输出的内容要大些,大于1K? 
    for(var i = 0; i < 1000; i++) {
        response.write('<p id="' + i + '">Loading...</p>');
    }
    response.write("</p>");
    var down = 6;
    for (i = 0; i < 6; i++) {
        var proxyRequest=http.request({
            hostname: 'localhost',
            port: 8000,
            path: "/?id=" + i,
            method: 'GET'
        });
        proxyRequest.on('response', function (proxyResponse) {
            --down;
            proxyResponse.on('data', function(chunk) {
                response.write(chunk, 'binary');
            });
            proxyResponse.on('end', function() {
                if(down == 0) {
                    response.end();
                }
            });
        });
        proxyRequest.end();
    }
    response.write("</body></html>");

}).listen(8080);
迷茫

你写回客户端端的是html么?

如果是,那在调用第一个res.write(data1)之前,加上res.writeHead(200, {'Content-Type': 'text/plain'});试试?

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号