Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回未定义的Javascript闭包_Javascript_Closures_Socket.io - Fatal编程技术网

返回未定义的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,我已经添加了一个答案作为可能的解决方案,也许它可以帮助您很大:-)无论如何,如果您在其他回调中有许多回调,您可以看看承诺,它们有助于以整洁的方式处理异步世界,关于它们的文章很多,例如: