与异步和同步函数相关的未定义javascript函数问题
目前,我正在从事一个从twitch.tv API检索数据的项目。我有两个功能–一个是分类用户是活动的、非活动的还是死亡的(已删除其帐户),另一个是根据用户的状态获取特定数据。例如,如果在运行与异步和同步函数相关的未定义javascript函数问题,javascript,jquery,asynchronous,callback,undefined,Javascript,Jquery,Asynchronous,Callback,Undefined,目前,我正在从事一个从twitch.tv API检索数据的项目。我有两个功能–一个是分类用户是活动的、非活动的还是死亡的(已删除其帐户),另一个是根据用户的状态获取特定数据。例如,如果在运行分类功能时,我发现user1处于活动状态,则使用profile功能,我将检索他/她的个人资料图片和简历。我将从profile函数返回的字符串值存储在add变量中,但是console.log(add)显示为未定义。我的代码如下。任何解释或解决方案将不胜感激!我是Javascript的新手,所以一个简单化的解释会
分类
功能时,我发现user1
处于活动状态,则使用profile
功能,我将检索他/她的个人资料图片和简历。我将从profile
函数返回的字符串值存储在add
变量中,但是console.log(add)
显示为未定义。我的代码如下。任何解释或解决方案将不胜感激!我是Javascript的新手,所以一个简单化的解释会很好
$(document).ready(function(){
var users= ["freecodecamp", "storbeck", "terakilobyte", "habathcx","RobotCaleb","thomasballinger","noobs2ninjas","beohoff", "MedryBW", "comster404", "brunofin"];
classification(users);
function classification(arr){
for(var i=0; i<arr.length; i++) {
(function(i) {
$.getJSON("https://api.twitch.tv/kraken/streams/"+arr[i]+"?callback=?", function (data){
var code="";
if(data.stream) {
var add= profile(arr[i], data.stream);
code="<div id='"+arr[i]+"' class='active'><a href='http://www.twitch.tv/"+arr[i]+"'>"+arr[i]+"</a><img class='check-icon' src='css/images/check.png'>"+add+"</div>";
//why is add undefined??
console.log(add);
$("#content").append(code);
} else if (data.stream===null) {
var add= profile(arr[i], data.stream);
code="<div id='"+arr[i]+"' class='inactive'><a href='http://www.twitch.tv/"+arr[i]+"'>"+arr[i]+"</a><img class='x-icon' src='css/images/x.png'>"+add+"</div>";
//why is add undefined??
console.log(add);
$("#content").append(code);
} else if (data.error) {
code="<div id='"+arr[i]+"' class='dead'>Unfortunately "+arr[i]+" has deleted their account</div>";
$("#content").append(code);
}
});
})(i);
}
}
function profile(val, ifActive) {
var code="";
$.getJSON("https://api.twitch.tv/kraken/users/"+val+"?callback=?", function (data){
if(ifActive) {
var pic= data.logo;
var bio= data.bio;
code="<span class='pic'><img src='"+pic+"'></span><div class='bio'>"+bio+"</div>";
return code;
} else if(ifActive===null) {
var pic= data.logo;
code="<span class='pic'><img src='"+pic+"'></span>";
return code;
}
});
}
$(文档).ready(函数(){
var用户=[“freecodecamp”、“storbeck”、“TB”、“habathcx”、“RobotCaleb”、“thomasballinger”、“Noobs2nijas”、“beohoff”、“MedryBW”、“comster404”、“brunofin”];
分类(用户);
功能分类(arr){
对于(变量i=0;i“+添加+”;
//为什么添加未定义??
控制台日志(添加);
$(“#内容”)。追加(代码);
}else if(data.stream==null){
var add=profile(arr[i],data.stream);
代码=“添加+”;
//为什么添加未定义??
控制台日志(添加);
$(“#内容”)。追加(代码);
}else if(data.error){
code=“不幸的是”+arr[i]+“删除了他们的帐户”;
$(“#内容”)。追加(代码);
}
});
})(i) );
}
}
功能配置文件(val、ifActive){
var代码=”;
$.getJSON(“https://api.twitch.tv/kraken/users/“+val+”?回调=?”,函数(数据){
如果(i活动){
var pic=data.logo;
var bio=data.bio;
代码=“生物+”;
返回码;
}else if(ifActive==null){
var pic=data.logo;
代码=”;
返回码;
}
});
}
});在配置文件函数中实现回调
$(document).ready(function(){
var users= ["freecodecamp", "storbeck", "terakilobyte", "habathcx","RobotCaleb","thomasballinger","noobs2ninjas","beohoff", "MedryBW", "comster404", "brunofin"];
classification(users);
function classification(arr){
for(var i=0; i<arr.length; i++) {
(function(i) {
$.getJSON("https://api.twitch.tv/kraken/streams/"+arr[i]+"?callback=?", function (data){
var code="";
if(data.stream) {
profile(arr[i], data.stream, function(add){
code="<div id='"+arr[i]+"' class='active'><a href='http://www.twitch.tv/"+arr[i]+"'>"+arr[i]+"</a><img class='check-icon' src='css/images/check.png'>"+add+"</div>";
//why is add undefined??
console.log(add);
$("#content").append(code);
});
} else if (data.stream===null) {
profile(arr[i], data.stream, function(add){
code="<div id='"+arr[i]+"' class='inactive'><a href='http://www.twitch.tv/"+arr[i]+"'>"+arr[i]+"</a><img class='x-icon' src='css/images/x.png'>"+add+"</div>";
//why is add undefined??
console.log(add);
$("#content").append(code);
});
} else if (data.error) {
code="<div id='"+arr[i]+"' class='dead'>Unfortunately "+arr[i]+" has deleted their account</div>";
$("#content").append(code);
}
});
})(i);
}
}
function profile(val, ifActive, callback) {
var code="";
$.getJSON("https://api.twitch.tv/kraken/users/"+val+"?callback=?", function (data){
if(ifActive) {
var pic= data.logo;
var bio= data.bio;
code="<span class='pic'><img src='"+pic+"'></span><div class='bio'>"+bio+"</div>";
if(typeof callback == 'function') {
callback(code);
}
} else if(ifActive===null) {
var pic= data.logo;
code="<span class='pic'><img src='"+pic+"'></span>";
if(typeof callback == 'function') {
callback(code);
}
}
});
}
});
$(文档).ready(函数(){
var用户=[“freecodecamp”、“storbeck”、“TB”、“habathcx”、“RobotCaleb”、“thomasballinger”、“Noobs2nijas”、“beohoff”、“MedryBW”、“comster404”、“brunofin”];
分类(用户);
功能分类(arr){
对于(变量i=0;i“+添加+”;
//为什么添加未定义??
控制台日志(添加);
$(“#内容”)。追加(代码);
});
}else if(data.stream==null){
配置文件(arr[i]、数据流、函数(添加){
代码=“添加+”;
//为什么添加未定义??
控制台日志(添加);
$(“#内容”)。追加(代码);
});
}else if(data.error){
code=“不幸的是”+arr[i]+“删除了他们的帐户”;
$(“#内容”)。追加(代码);
}
});
})(i) );
}
}
函数配置文件(val、iActive、回调){
var代码=”;
$.getJSON(“https://api.twitch.tv/kraken/users/“+val+”?回调=?”,函数(数据){
如果(i活动){
var pic=data.logo;
var bio=data.bio;
代码=“生物+”;
if(回调类型=='function'){
回调(代码);
}
}else if(ifActive==null){
var pic=data.logo;
代码=”;
if(回调类型=='function'){
回调(代码);
}
}
});
}
});
这是因为profile函数不返回任何值。内部Ajax调用可以,但是您需要做的是返回一个回调,该回调的值返回到classification。您不能从异步方法返回。按照你的编码方式,它是行不通的。基本上是var add=profile(arr[i],data.stream)后面的所有代码当您获取配置文件数据时,需要在配置文件回调中执行代码>行。@epascarello有趣。。。我认为我的profile函数是一种同步方法。你怎么知道它是异步的?我有点难以理解如何区分这两个,所以任何解释或有用的链接将不胜感激!jQuery的getJSON不是同步的。