我正在尝试从数组请求动态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
值。它可以但它只打印数组的最大值。为什么在请求中打印出相同的值?还有其他更优雅的方式吗?感谢。
答案 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) {...}