【问题标题】:The variable I reset in my forloop does not change我在 forloop 中重置的变量没有改变
【发布时间】:2020-12-06 19:23:30
【问题描述】:
var dragcar;
dragelem = { name: 'foo', rowid: '1', kw: '50', convoy: '1' };
if (dragelem.name.length > 0) {
  //get dragcar
  resdb.forEach((worker) => {
    //find matching worker in db
    if (worker.name == dragelem.name) {
      //worker has no carid
      if (worker.carid == null) {
        dragcar = null;
      } else {
        dragcarid = worker.carid;
        connection.query("SELECT name FROM cars WHERE carid = ?;", [dragcarid], (errdb2, resdb2) => {
          //error while selecting data
          if (errdb2) {
            console.log(errdb2);
          } else {
            dragcar = resdb2[0].name;
          }
        })
      }
    }
  })
}

所以如果我在循环之后记录变量,它会说它是未定义的。非常感谢您提供解决此问题的方法。

最好的问候

【问题讨论】:

  • 数据库查询是异步的。在尝试记录变量之前,您是否在等待它们完成?尝试将您的 console.log 放在 else 语句中,紧跟在 dragcar = ... 之后
  • 好吧,我需要循环之外的值,这样我就可以用它创建一个新的数据库条目。

标签: javascript mysql loops for-loop global-variables


【解决方案1】:

逻辑是正确的(dragcar 将保存循环的最后一次迭代中设置的 resdb2[0].name 的值)——问题是代码永远不会运行,可能是因为 resdb 为空或worker.name 永远不等于dragelem.name。

编辑 - 没有注意到异步的事情。正如评论中指出的,查询回调将在当前任务(包括整个forEach 调用和后续代码)完成后运行。您可以按照建议将相关代码移动到回调中,或者使用带有承诺的await 使代码遵循更同步的流程。

【讨论】:

  • 数据库不是空的,我真的需要循环之外的变量,所以我可以在循环之后启动更新查询(我有这个循环两次,因为在第一个循环中我设置了 dropcar 和第二个我设置了dragcar,因为该值也可以为null,所以我必须在之前检查它的if语句)。希望我的写作方式可以理解。
  • 这是所谓的“回调地狱”的一个例子。为了解决这个问题,你真的需要像 async 库 (github.com/caolan/async)、async/await 或像 Bluebird (npmjs.com/package/bluebird) 这样的 promise 库。如果您不想使用 Promise,那么 async 就是要走的路。它具有执行 map、forEach 等的异步版本的函数,以及将函数串在一起以便在前一个函数及其所有回调完成时运行下一个函数 (series)。
  • 感谢您的回答伙伴,我要试试这个。希望它适用于此。
猜你喜欢
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 2011-09-18
  • 2015-08-30
  • 2014-12-02
  • 1970-01-01
相关资源
最近更新 更多