父范围内的variables不会在匿名函数中被修改

我使用opentok SDK进行video聊天,我需要创build会话。 这是非常简单的,这部分工作正常。 这一切都在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保留它的初始值''(空string),而不是它被分配给的sessionId 。 帮帮我?

这不是一个关于范围的问题。 这是关于asynchronous性。 您的匿名函数更新父函数中的sessionvariables; 但是因为你的匿名函数是asynchronous的,所以 generateSession返回之后就会发生。

相反,您需要修改generateSession来接受callback,并在完成后执行callback(传递生成的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. }); 

这与我如何从asynchronous调用返回响应完全相同的问题? (在这种情况下,它是asynchronous的“成功”callback); 可能有更合适的重复,但我找不到一个:(但它仍然是有益的阅读通过它虽然。

createSession是一个asynchronous函数。 它的callback在generateSession完成一段时间之后才会执行。 你需要传递一个callback,而不是:

 function generateSession(cb){ opentok.createSession(cb); } generateSession(function(err, sessionId) { if (err) throw err; // use sessionId });