bigpipe 仍然按照最长的时间响应数据

图片描述

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

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

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

图片描述

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

阅读 3.5k
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">div{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><div>Progressive Loading");
    
    //[KEYCODE] 第1次输出的内容要大些,大于1K? 
    for(var i = 0; i < 1000; i++) {
        response.write('<div id="' + i + '">Loading...</div>');
    }
    response.write("</div>");
    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'});试试?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏