【问题标题】:Access variables from parent in nested asynchronous calls在嵌套的异步调用中从父级访问变量
【发布时间】:2018-01-07 00:46:13
【问题描述】:

我无法弄清楚为什么我无法从子调用中访问变量。我以前在一个独立的函数中有这个代码并且它可以工作,但是由于将它移动到我的 websocket 的主线程它没有。

问题是auth_session 可以在第一个查询范围内访问,但由于某种原因不能在第二个查询范围内访问,即使它是一个孩子。

 mysqlconn.query('SELECT * FROM auth_sessions WHERE session_id = ? AND session_name = ? AND (expires > ? OR expires = 0) LIMIT 1', [cookies.SESSION_ID, cookies.SESSION_NAME, time()], function(err, results, fields) {
  if (err) { throw err; }
    if (results.length == 1) {
      var auth_session = results[0];
      if (md5(request.httpRequest.headers['user-agent'] + (request.httpRequest.headers['accept-encoding'] + request.httpRequest.headers['accept-language'])) == auth_session.fingerprint) {
        mysqlconn.query('SELECT * FROM users WHERE id = ? LIMIT 1', [auth_session.uid], function(err, results, fields) { // auth_session is defined here (I have checked using console.log() too)
          if (err) { throw err; }
          if (results.length === 1) {
            var userinfo = results[0];
            if (auth_session.session === 1) { // throws: TypeError: Cannot read property 'session' of undefined     
              mysqlconn.query('UPDATE auth_sessions SET expires = ? WHERE id = ? LIMIT 1', [time() + SESSION_TIMEOUT, auth_session.id]);
            }
            // do some stuff with variables inside of userinfo
          } else { reject_request(); }
        });
      } else { reject_request(); }
    } else { reject_request(); }
  });
}

【问题讨论】:

  • 我们没有看到完整的功能。是否可以在同一个函数的其他地方使用 auth_session?
  • @NineBerry,不,它不在其他任何地方使用。在调用这两个函数之前,我尝试删除前面的 var 并将 auth_session 定义为全局变量。但这也没有用。
  • 使用全局变量实际上会让事情变得更糟。你试过用 let 代替 var 吗?
  • 使用let时出现此错误:SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
  • @NineBerry,实际上你的第一条评论是对的。在// do some stuff 部分中,我定义了var auth_session = ....,这导致内部查询范围根本不继承auth_session。

标签: node.js scope


【解决方案1】:

此答案应归功于 @NineBerry,但在 cmets 之外没有发布任何答案。

问题是在最里面的循环内部,有一个声明隐藏在某个地方,带有var auth_session = ...。这意味着变量auth_session 从未被该循环继承,因此在循环内部定义之前是未定义的。

通过删除var,最里面的函数继承了变量,因此能够在更大的范围内访问和更改它。

【讨论】:

    猜你喜欢
    • 2015-10-02
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2015-08-10
    相关资源
    最近更新 更多