body + = chunk将在每次chunk到达时重新分配整个响应字符串?

时间:2010-12-05 02:21:52

标签: javascript node.js

我正在读这篇文章=> http://mgutz.com/2010/10/01/check_gmail_with_node_js.html

以下评论Shomrom说:

  

body + = chunk将重新分配   每次一个完整的响应字符串   块到了。我相信会的   将每个块附加到一个块上要好得多   数组并在你有的时候做一个.join()   所有你需要的。

是否 body + = chunk每次块到达时真的会重新分配整个响应字符串吗?如果是这样,改进这个片段的最佳方法是什么,我们可以尽可能便宜地打印body

它包含以下代码段:

var http = require('http');

var user = 'user@gmail.com';
var password = 'password';
var auth = new Buffer(user + ':' + password).toString('base64');

var google = http.createClient(443, 'mail.google.com', true);
var request = google.request('GET', '/mail/feed/atom/', {
    'Host': 'mail.google.com', 
    'Authorization': 'Basic ' + auth 
});

request.addListener('response', function(res) {
    var body = '';    
    res.addListener('data', function(chunk) { 
        body += chunk;
    });
    res.addListener('end', function() { 
        console.log(body); 
    });
});

request.end();

1 个答案:

答案 0 :(得分:2)

不一定每次,但一般来说它可能经常这样做(比如说一半的时间,取决于字符串的长度和JavaScript的实现)。使用数组和连接是一个很好的建议:

var bodyBuilder = [];
res.addListener('data', function(chunk) {
    bodyBuilder.push(chunk);
});

完成后,加入

var body = bodyBuilder.join('');

原因是字符串通常存储为连续的字符数组。当附加额外字符时,如果在字符串末尾没有足够的可用空间来存储额外的东西,则可能必须在内存中移动该数组。一个实现可能会保留一些额外的空间,但多少是你无法控制的。