父范围中的变量在匿名函数中不会被更改

时间:2014-05-28 14:28:57

标签: javascript node.js opentok

我正在使用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。帮助

2 个答案:

答案 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
});