创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); }
并比较输出。
这演示了let
和var
之间的区别。
有关let
和var
之间的区别的更多信息,请参阅以下答案:
- 为什么let和var绑定使用setTimeout函数有不同的performance?