Javascript:变量值在循环中从未更改

Javascript:变量值在循环中从未更改,javascript,loops,scope,Javascript,Loops,Scope,代码如下: 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

代码如下:

 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();
 }
var链接,摘要;
对于(var i=0;i

正如我在代码中所评论的,
link
从不改变,它取第一个值,然后
process()
始终取
link
的相同值,而
summary
总是不同的,这是意料之中的。

req
是一个异步函数,因此,与外部循环相比,无法保证返回的顺序。因此,在这种情况下,几乎可以肯定的是,外部循环在请求返回之前就完成了,因此
link
总是一样的


与其这样做,不如尝试使用
承诺
,或者将
链接
的值作为参数传递给请求,以便它在每次返回时都具有正确的值。

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);
 }
var链接,摘要;
对于(var i=0;i
这些HTTP请求是异步的。外部循环将在启动所有请求后立即完成。当请求回调最终发生时,
link
的值将与上次迭代时的值相同。您可以将请求分离为一个函数,并将
link
作为该函数的参数传递function@AlonEitan,我按照你的建议做了,而且很有效。你能回答一下吗?我会接受答案。对于其他人,非常感谢你提供的信息,这些信息非常有价值@SamKirklandWA没关系,你可以自己回答你的问题。感谢您让我知道:)为了最佳实践,我将提到在循环中定义函数不是最佳的。你可以在循环外定义你的函数,用相同的参数调用它,这样你就不用在循环的每次迭代中重新定义函数,节省内存和cpu周期。