当前位置: 首页 > 知识库问答 >
问题:

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

戚云
2023-03-14

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

管峻
2023-03-14

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

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

generateSession(function(err, sessionId) {
  if (err) throw err;
  // use sessionId
});
丁承德
2023-03-14

这不是关于范围的问题。这是关于异步性的。您的匿名函数将更新父函数中的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”回调是异步的);可能有更合适的副本,但我找不到一个:(。不过通读一下还是有好处的。

 类似资料:
  • 问题内容: 我在玩PHP中的匿名函数,并意识到它们似乎并没有到达它们之外的变量。有什么办法可以解决这个问题? 例: 这将输出“无”。匿名函数有什么方法可以访问? 问题答案: 是的,使用闭包: 请注意,为了使您能够在匿名函数范围之外修改和检索修改后的值,必须在闭包中使用对其进行引用。

  • 我在PHP中使用匿名函数,发现它们似乎无法访问外部变量。有什么办法可以绕过这个问题吗? 示例: 这将输出“nothing”。匿名函数有没有办法访问变量?

  • 本文向大家介绍深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域,包括了深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域的使用技巧和注意事项,需要的朋友参考一下 匿名函数:没有实际名字的函数。 匿名函数的作用: 1、通过匿名函数可以实现闭包,关于闭包在后面的文章中会重点讲解。在这里简单介绍一下:闭包是可以

  • 我只是想问一下如何在一个状态中嵌套视图,以及如何在这些视图之间共享一些上下文。 并且我有一个header.html呈现在内部,名为如下所示: 这是一个非常简单的模板,但它显示了我有的问题。当呈现名为的组件时,它取决于路由(状态)。和是在抽象父状态中定义的,因此我不需要在子状态中重复它们。子状态仅为父状态()定义。 例如,如何从子状态控制中的作用域变量,以便根据状态轻松切换此视图中的。我在inter

  • php版本: 5.4 我定义了一个这样的函数 输出是 如何在的正文中引用。

  • 问题内容: 如何从匿名成功函数中更新returnHtml变量? 问题答案: 那是错误的方法。AJAX中的第一个A是异步的。该函数在AJAX调用返回之前返回(或者至少可以返回)。因此,这不是范围问题。这是订购的问题。只有两个选项: 使用选项使AJAX调用同步( 不推荐 );要么 改变思维方式。代替从函数返回HTML,您需要传递一个回调,以在AJAX调用成功时被调用。 作为(2)的示例: