我正在使用opentok SDK进行视频聊天,我需要创建会话。这很简单,那部分工作正常。这都是在服务器端node.js中完成的。
问题是 - 这主要是因为我仍然没有完全获得var范围(特别是匿名函数和闭包) - 我有一个我想要访问的匿名函数内部的值(最好是将它分配给另一个) var,一个在其父范围内),但不能!
这样的事情:
function generateSession(session){
var session='';
opentok.createSession(function(error, sessionId){
if (error) {
throw new Error("Session creation failed.");
}
session = sessionId;
});
return session;
}
session
保留了''(空字符串)的初始值,而不是它所分配的sessionId
。帮助
答案 0 :(得分:4)
这不是关于范围的问题。这是关于异步性的。您的匿名函数将更新父函数中的session
变量;但是因为你的匿名函数是异步的,所以 generateSession
返回后会发生。
相反,您需要修改generateSession
以接受回调,并在完成后执行回调(传递生成的session
);
function generateSession(session, cb){
opentok.createSession(function(error, sessionId){
if (error) {
throw new Error("Session creation failed.");
}
cb(sessionId);
});
}
generateSession(blahblahblah, function (session) {
// Access session here.
});
这与How do I return the response from an asynchronous call?完全相同(在这种情况下,它是异步的“成功”回调);可能有一个更合适的副本,但我找不到一个:(。虽然阅读它仍然是有益的。
答案 1 :(得分:1)
createSession
是一个异步函数。它的回调直到generateSession
完成后的某个时间才会执行。你需要传递一个回调:
function generateSession(cb){
opentok.createSession(cb);
}
generateSession(function(err, sessionId) {
if (err) throw err;
// use sessionId
});