代码如下:
var link, summary;
for (var i = 0; i < json.cards[0].widgets.length; i++) {
link = json.cards[0].widgets[i].text;
var params = {
// various parameters
};
var req = http.request(params, function(res) {
res.on('data', function(data) {
summary = JSON.parse(data.toString()).content;
// Now, the process method takes "summary" correctly,
// but "link" is always the same, hence, not changing
// on every other cycle.
process(summary, link);
// That's how it would look if looped 3 times
// process('positive', 'http://www.google.com/blah');
// process('negative', 'http://www.google.com/blah');
// process('neutral', 'http://www.google.com/blah');
});
});
req.end();
}正如我在代码中注释的那样,link永远不会改变,它采用第一个值,然后process()始终采用相同的link值,而summary总是不同的,这是意料之中的。
发布于 2017-02-24 05:12:32
Alon Eitan帮助我解决了这个问题,他建议将它分离在一个单独的函数中,并且它起作用了。这就是我的代码现在的样子:
var link, summary;
for (var i = 0; i < json.cards[0].widgets.length; i++) {
link = json.cards[0].widgets[i].text;
var params = {
// various parameters
};
var sent = function(link, params){
var req = http.request(params, function(res) {
res.on('data', function(data) {
summary = JSON.parse(data.toString()).content;
process(summary, link);
});
});
req.end();
}
sent(link, params);
}发布于 2017-02-24 04:59:54
req是一个异步函数,因此不能保证与外部循环相比,它返回的顺序是什么。因此,在这种情况下,几乎可以肯定的是,外部循环甚至在请求返回之前就结束了,因此link总是相同的。
与其这样做,不如尝试使用promises,或者将link的值作为参数传递给请求,以便每次返回时都有正确的值。
https://stackoverflow.com/questions/42426028
复制相似问题