创build.json文件的代码片段不起作用

我有这个代码,它的东西是,我需要它从该网站获取一些数据,string在apiurl 。 这段代码需要下载这些网站,在json中find一些appids。 它需要下载这些网站上的数据并将它们存储在一个json文件中。 由于某种原因,这是行不通的。

我有一个.js文件中的这段代码:

var gamekeys = JSON.parse(fs.readFileSync('gamekeys.json')); var jsonstring = JSON.stringify(gamekeys, null, 4); UpdateGamePricelist(); function UpdateGamePricelist() { for(var i = 0;i<gamekeys.keys.length;i++) { appid = gamekeys.keys[i].appid; var apiurl = "http://store.steampowered.com/api/appdetails?appids="+appid; if (i < 95) { request(apiurl, function(err, response, body) { if (err) { console.log("Error when updating game prices: " + err+"\n"); return; } var apiresponse = JSON.parse(body); if (body == "") { console.log("Could not find a pricelist m8"); return; } fs.writeFile("C:/Users/ahmad/Desktop/Bots/SteamKeyProfitter/gamespricelist/"+appid+".json", body, function(err) { if(err) { console.log("Error saving data to game pricelist: " + err); return; } console.log("Game pricelist has been updated!"); }); }); } } } 

我有一个json文件,名为gamekeys.json的json文件

这里是:

 { "keys": [ { "appid": 10, "price":0, "listofkeys":[], "game": "Counter-Strike" }, { "appid": 20, "price":0, "listofkeys":[], "game": "Team Fortress Classic" }, { "appid": 30, "price":0, "listofkeys":[], "game": "Day of Defeat" }, { "appid": 40, "price":0, "listofkeys":[], "game": "Deathmatch Classic" }, 

它继续下去(那200万行)

为什么第一个代码不能创build95个json文件?

问题在于你的appid对于所有的writeFile调用是一样的。

尝试改变:

 appid = gamekeys.keys[i].appid; 

至:

 let appid = gamekeys.keys[i].appid; 

你需要一个新的绑定所有的callback,否则他们都得到相同的价值(从最后一次循环迭代)。 请注意, var不会在这里工作,你需要let 。 如果你在一个闭包中使用i ,那么你也需要使用for (let i = ...)而不是for (var i = ...)

apiurl可以用var声明,因为它的值被传递给request()调用,而不是被闭包捕获,但是如果你使用let的时间,而不使用var你不必担心。

如果你总是用'use strict';来开始每个程序'use strict'; (带引号),而且从不使用var (用let或者const来代替),那么你在这里的范围就不会有问题,所以这是一个很好的练习,可以用linters来实现。

这是问题之一。 可能还有更多,但这肯定是其中之一。

更新

回答Alex的评论“他为什么不能使用var appid”

运行这个代码:

 for (var i = 0; i < 4; i++) { let appid = 'ID' + i; setTimeout(function () { console.log(appid); }, 500 * i); } 

并运行这个程序:

 for (var i = 0; i < 4; i++) { var appid = 'ID' + i; setTimeout(function () { console.log(appid); }, 500 * i); } 

并比较输出。

这演示了letvar之间的区别。

有关letvar之间的区别的更多信息,请参阅以下答案:

  • 为什么let和var绑定使用setTimeout函数有不同的performance?