我正在处理一个挑战,我必须显示处于脱机状态和联机状态的Twitch通道。这里是有bug的函数:getJSON函数中覆盖的变量值
function loadStreams(){
for (var i = 0; i < channel_list.length; i++){
offlineName = channel_list[i];
console.log("offline name is: " + offlineName);
URL = "https://wind-bow.hyperdev.space/twitch-api/streams/" + channel_list[i] + "?callback=?";
$.getJSON(URL, function(data){
console.log("Now offline name is: " + offlineName);
console.log(data);
if (data.stream !== null){
currChannel = new Channel(data.stream.channel.display_name, data.stream.channel.status);
}
else {
currChannel = new Channel(offlineName, "Offline");
}
outArr.push(currChannel);
});
}
//showAll();
}
channe_list是一个预加载通道名称的字符串数组。它的定义如下:
var channel_list = ["ESL_SC2", "OgamingSC2", "cretetion", "freecodecamp", "storbeck", "habathcx", "RobotCaleb", "noobs2ninjas"];
我的代码只需通过channel_list去,获取JSON数据,并返回结果并创建频道对象的新实例,其定义为:
var Channel = function(name, status){
this.name = name;
this.status = status;
}
由于某些原因,在我的else块中,变量“offlineName”总是被channel_list数组的最后一个值'noobs2ninjas'覆盖。换句话说,当我在else块中创建一个Channel类的实例时,“offlineName”总是“noobs2ninjas”。请让我知道我在这里做错了什么。这是我的CodePen如果你想看看整个事情:
https://codepen.io/tcao2/pen/XNbbbm?editors=1010
非常感谢您的回复新手看看兼容性图表!有趣的是,问题出在网络的速度和循环的运行速度上(我习惯于Java,刚开始学习js和web dev)。第一种解决方案对我来说很有意义(我将不得不考虑'let'关键字),但对于第二种解决方案,闭包有什么作用? –
@Thinh Cao新增编辑 – Viney
非常感谢! –