Javascript 在本例中,如何正确创建数组并在范围之外使用它?

Javascript 在本例中,如何正确创建数组并在范围之外使用它?,javascript,html,arrays,database,scope,Javascript,Html,Arrays,Database,Scope,我已经使用同事的包“db”编写了一些代码。首先,它获取电影拍摄日会话的列表,然后列出拍摄日会话中捕获的快照,然后“getCapture”函数获取每个快照的快照信息。我试图使用这个getCapture函数来读取快照信息(即名称、大小、主题)以及['Node information']['name'],以便只获取快照名称。我想在一天的所有训练和他们的所有投篮中都做到这一点。我已经了解了如何执行此操作,并在下面的示例中使用“console.log(captureInfo.\u data['Node I

我已经使用同事的包“db”编写了一些代码。首先,它获取电影拍摄日会话的列表,然后列出拍摄日会话中捕获的快照,然后“getCapture”函数获取每个快照的快照信息。我试图使用这个getCapture函数来读取快照信息(即名称、大小、主题)以及['Node information']['name'],以便只获取快照名称。我想在一天的所有训练和他们的所有投篮中都做到这一点。我已经了解了如何执行此操作,并在下面的示例中使用“console.log(captureInfo.\u data['Node Information']['NAME'])”返回了名称列表。但是,我希望能够在此范围之外的数组中使用这些结果。当我尝试像第二个例子中那样推送这些结果时,它会一次又一次地打印出名称的多个副本。我希望能够将快照名称添加到一个数组中,这样该数组就可以在整个范围之外使用,只是不知道如何操作

只记录并列出一次所有快照,但不将结果放入变量/数组的示例:

      var sessionURL = ("X:\\Private_LowPerf\\TESTING_DATA\\Capture day 1.file");

    async function main (){
      var captures = [];
      var captureInfo = [];
      var captureNames = [];

      if (sessionURL){
        var sessions = await _db.listSessions(sessionURL);
        sessions.forEach(async (item) => {
          if(sessions){
            var captures = await _db.listCaptures(item);
            }

            captures.forEach(async (item) => {
              if(sessions){
                var captureInfo = await _db.getCapture(item.path);

                console.log(captureInfo._data['Node Information']['NAME']);

    }
      })

          })
        }
      }
      main();
由于范围界定问题而打印出太多名称副本,因此无法正常工作的示例:

async function main (){
  var captures = [];
  var captureInfo = [];
  var captureNames = [];

  if (sessionURL){
    var sessions = await _db.listSessions(sessionURL);
    sessions.forEach(async (item) => {
      if(sessions){
        var captures = await _db.listCaptures(item);
        }

        captures.forEach(async (item) => {
          if(sessions){
            var captureInfo = await _db.getCapture(item.path);

}
        captureNames.push(captureInfo._data['Node Information']['NAME']);
        console.log(captureNames);

  })

      })
    }
  }
  main();

您需要将控制台日志放在循环之外,否则,每次循环执行时,您都将打印当前项目以及以前的项目

Array.prototype.forEachAsync = async function(cb){
    for(let x of this){
        await cb(x);
    }
}


async function main() {
    var captures = [];
    var captureInfo = [];
    var captureNames = [];

    if (sessionURL) {
        var sessions = await _db.listSessions(sessionURL);
        await sessions.forEachAsync(async (item) => {
            if (sessions) {
                var captures = await _db.listCaptures(item);
            }

            await captures.forEachAsync(async (item) => {
                if (sessions) {
                    var captureInfo = await _db.getCapture(item.path);
                    captureNames.push(captureInfo._data['Node Information']['NAME']);
                }

            })

        })


        console.log(captureNames);
    }
}
main();


编辑:在处理异步函数时,需要确保在调用console.log之前执行了循环。这就是为什么我们需要forEachAsync的原因

我尝试了这个方法,而不是像第一个示例中那样打印名称列表,而是打印“[]”。你知道为什么它不读取数组吗?我有问题,因为你没有等待foreach循环(你在它们内部等待,但在外部范围内你不等待)。在填充数组之前正在调用console.log!这正好回答了我的问题。非常感谢,成功了!