返回未定义的Javascript闭包
这是我的代码:返回未定义的Javascript闭包,javascript,closures,socket.io,Javascript,Closures,Socket.io,这是我的代码: var timeNow = function () { var time = new Date(); return ((time.getHours() < 10)?"0":"") + time.getHours() +":"+ ((time.getMinutes() < 10)?"0":"") + time.getMinutes() +":"+ ((time.getSeconds() < 10)?"0":"") + time.getSeconds
var timeNow = function () {
var time = new Date();
return ((time.getHours() < 10)?"0":"") + time.getHours() +":"+ ((time.getMinutes() < 10)?"0":"") + time.getMinutes() +":"+ ((time.getSeconds() < 10)?"0":"") + time.getSeconds();
};
var RegisterConnection = function (socketid, AuthToken) {
request.get("api.php", function(err, res, Response){ //Response will return {"result": true}
Response = JSON.parse(Response);
if (!err && res.statusCode === 200 && Response.result) {
console.log(Response.result); // true on console
return (String(Response.result));
}
});
};
io.sockets.on("connection", function (clientSocket) {
clientSocket.on("connectionDone", function (data) {
clientSocket.authToken = data.authToken;
clientSocket.emit(
"info", {
Time: timeNow(), // It's printing the time
information: RegisterConnection(data.socketid, data.authToken) // It's printing undefined
}
);
});
});
var timeNow=函数(){
变量时间=新日期();
return((time.getHours()<10)?“0”:“)+time.getHours()+”:“+((time.getMinutes()<10)?“0”:“)+time.getMinutes()+”:“+((time.getSeconds()<10)?“0”:“)+time.getSeconds();
};
var RegisterConnection=函数(socketid、AuthToken){
get(“api.php”,函数(err,res,Response){//Response将返回{“result”:true}
Response=JSON.parse(Response);
如果(!err&&res.statusCode==200&&Response.result){
console.log(Response.result);//在控制台上为true
返回(字符串(Response.result));
}
});
};
io.sockets.on(“连接”,函数(clientSocket){
clientSocket.on(“ConnectionOne”,函数(数据){
clientSocket.authToken=data.authToken;
clientSocket.emit(
“信息”{
Time:timeNow(),//它正在打印时间
信息:RegisterConnection(data.socketid,data.authToken)//它正在打印未定义的内容
}
);
});
});
我是javascript闭包新手,这对我不起作用,因为RegisterConnection返回未定义。但是在函数本身中,console.log确实在控制台中打印true。我做错了什么?请检查此方法是否适用于您:
var timeNow = function () {
var time = new Date();
return ((time.getHours() < 10)?"0":"") + time.getHours() +":"+ ((time.getMinutes() < 10)?"0":"") + time.getMinutes() +":"+ ((time.getSeconds() < 10)?"0":"") + time.getSeconds();
};
var RegisterConnection = function (socketid, AuthToken, onSuccess) {
request.get("api.php", function(err, res, Response){ //Response will return {"result": true}
Response = JSON.parse(Response);
if (!err && res.statusCode === 200 && Response.result) {
console.log(Response.result); // true on console
onSuccess(String(Response.result));
}
});
};
io.sockets.on("connection", function (clientSocket) {
clientSocket.on("connectionDone", function (data) {
clientSocket.authToken = data.authToken;
RegisterConnection(data.socketid, data.authToken, function(result) {
clientSocket.emit(
"info", {
Time: timeNow(), // It's printing the time
information: result
}
);
})
});
});
var timeNow=函数(){
变量时间=新日期();
return((time.getHours()<10)?“0”:“)+time.getHours()+”:“+((time.getMinutes()<10)?“0”:“)+time.getMinutes()+”:“+((time.getSeconds()<10)?“0”:“)+time.getSeconds();
};
var RegisterConnection=函数(socketid、AuthToken、onSuccess){
get(“api.php”,函数(err,res,Response){//Response将返回{“result”:true}
Response=JSON.parse(Response);
如果(!err&&res.statusCode==200&&Response.result){
console.log(Response.result);//在控制台上为true
onSuccess(字符串(Response.result));
}
});
};
io.sockets.on(“连接”,函数(clientSocket){
clientSocket.on(“ConnectionOne”,函数(数据){
clientSocket.authToken=data.authToken;
RegisterConnection(data.socketid、data.authToken、函数(结果){
clientSocket.emit(
“信息”{
Time:timeNow(),//它正在打印时间
信息:结果
}
);
})
});
});
RegisterConnection没有return语句,因此您将始终处于未定义状态。谢谢@Ian,我正在阅读它。如果我发现答案合适,我将关闭这个。@rsc1975它确实有一个返回(String(Response.result));虽然它在if语句中。那是因为我只包含了部分代码。但是让我们假设if条件始终为true,它仍然返回未定义的。Hi@TheJinStudio,不,它没有return语句,因为该返回在request.get回调中,它是另一个作用域。在这种情况下,使用“承诺”可能是一个不错的选择@TheJinStudio,我已经添加了一个答案作为可能的解决方案,也许它可以帮助您很大:-)无论如何,如果您在其他回调中有许多回调,您可以看看承诺,它们有助于以整洁的方式处理异步世界,关于它们的文章很多,例如: