提问者:小点点

父作用域中的变量在匿名函数[duplicate]中未被更改


我正在使用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个答案

匿名用户

这不是关于范围的问题。这是关于异步性的。您的匿名函数将更新父函数中的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.
});

这与如何从异步调用返回响应的问题完全相同?(在这种情况下,“success”回调是异步的);可能有更合适的副本,但我找不到一个:(。不过通读一下还是有好处的。

匿名用户

createSession是一个异步函数。直到GenerateSession完成后一段时间才执行其回调。您需要传入回调:

function generateSession(cb){
  opentok.createSession(cb);
}

generateSession(function(err, sessionId) {
  if (err) throw err;
  // use sessionId
});