JavaScript NodeJS HTTP请求 - 请求中无法访问的变量

时间:2018-04-04 19:57:31

标签: javascript node.js request

我正在尝试从数组请求动态URL-s,我在请求函数中访问其他全局变量时遇到问题。这是我"不工作的例子"代码

var body = '[{"id":"1","node_name":"kihinja","node_key":"2a55f8ecbdfa44f69ed5dee5842b21a5","server_url":"http:\/\/...","long_name":"Kuhinjski senzor","published":"1","check_string":"V6"},{"id":"2","node_name":"rasvjeta","node_key":"0f78f89eee9c481196db3f75691e7237","server_url":"http:\/\/...","long_name":"Stanje rasvjete","published":"1","check_string":"V1"}]';

var JSONObject = JSON.parse(body);
for (var key in JSONObject) {
if (JSONObject.hasOwnProperty(key)) {

    console.log(key); //outputs 0,1
    // prepare fetch urls according to their details
    var ftchNodeDetails = {
        method: 'GET',
        url: 'https://127.0.0.1:9443/' + JSONObject[key]["node_key"] + '/pin/' + JSONObject[key]["check_string"],
        method: JSONObject[key]["node_key"]
    };

    // run fetch for each node
    request(ftchNodeDetails, function (error, response, body) {
        if (error) throw new Error(error);
        console.log(JSONObject[key]["node_name"]);
        console.log(ftchNodeDetails.method); //prints same result for each key in loop
        console.log(key); //outputs 1,1

    }); // end request

   }
}

问题是key部分内无法打印request值。它可以但它只打印数组的最大值。为什么在请求中打印出相同的值?还有其他更优雅的方式吗?感谢。

1 个答案:

答案 0 :(得分:0)

因为闭包的工作方式,当fetch返回时,你的for循环已经到达最后一个元素。请参阅here

您可以绑定每次迭代所需的特定值。像这样:

var ftchNodeDetails = {
        method: 'GET',
        url: 'https://127.0.0.1:9443/' + JSONObject[key]["node_key"] + '/pin/' + JSONObject[key]["check_string"],
method: JSONObject[key]["node_key"]
};

function wrapper(ftchNodeDetails) { 
  request(ftchNodeDetails, function (error, response, body) {
    if (error) throw new Error(error);
    console.log(JSONObject[key]["node_name"]);
    console.log(ftchNodeDetails.method);
    console.log(key); //outputs 1,1
  });
}(ftchNodeDetails);

或者,就像JLRishe所说,使用let

for (let key in JSONObject) {...}