繁体   English   中英

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

[英]How can I properly create an array and use it outside of the scope in this example?

我已经使用同事包“ db”编写了一些代码。 首先,它获取电影拍摄日的会议列表,然后列出拍摄日会议中捕获的镜头,然后“ getCapture”功能获取每个镜头的镜头信息。 我正在尝试使用此getCapture函数读取镜头的信息(即名称,大小,主题)以及['Node Information'] ['NAME'],以便仅获取镜头名称。 我想在一天的所有时段及其所有镜头中做到这一点。 我想出了如何做到这一点,并在下面的示例中使用“ console.log(captureInfo._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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM