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

时间:2018-03-20 20:06:24

标签: javascript html arrays database scope

我使用同事包" db"编写了一些代码。首先,它会获得一个电影拍摄日的会话列表,然后列出拍摄日会话中拍摄的照片,然后是#34; getCapture"函数获取每个镜头的镜头信息。我正在尝试使用这个getCapture函数来读取镜头'信息(即姓名,大小,主题)以及['节点信息'] [' NAME'],以便仅获取镜头名称。我希望在当天的所有会议和所有镜头中都这样做。我已经弄清楚如何执行此操作并使用" console.log(captureInfo._data ['节点信息'] [&]返回以下示例中的名称列表#39; 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();

1 个答案:

答案 0 :(得分:1)

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

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

的原因