当前位置: 首页 > 知识库问答 >
问题:

我怎样才能正确地创建一个数组,并在这个例子的作用域之外使用它?

易祯
2023-03-14

我使用同事包“db”编写了一些代码。首先,它获取电影拍摄日的会话列表,然后列出拍摄日会话中捕获的镜头,然后“getCapture”功能获取每个镜头的镜头信息。我正在尝试使用此getCapture函数来读取镜头信息(即名称,大小,主题)以及['节点信息']['NAME'],以便仅获取镜头名称。我想用当天的所有会议和他们所有的镜头来做到这一点。我已经弄清楚了如何执行此操作,并使用“控制台.log(captureInfo._data['节点信息']['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个答案

周和志
2023-03-14

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

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

 类似资料:
  • 有什么方法可以简化这段代码吗?我正好有一个白色的一块,想要得到它的位置 代码: 瓦片类: 件类:

  • 我正在尝试获取角色id,但我不知道如何操作,因为它不起作用: 身份验证::用户- 对象(照亮\数据库\雄辩\收集)#843(1) {["项目":受保护]=

  • 我有一个项目中有两个不同的运行时(一个是lambda,一个是fargate)。我有两个不同的配置,但只希望运行一个。 如何排除和包含配置类?这似乎不起作用: 而且由于它们位于相同的“路径”中,因此我不能仅排除软件包 因为“持久”包也将被排除。

  • 使超链接在 中可单击是微不足道的。您只需在IB的视图上设置“检测链接”复选框,它就会检测HTTP链接并将其转换为超链接。 然而,这仍然意味着用户看到的是“原始”链接。RTF文件和HTML都允许你设置一个用户可读的字符串,在它的“后面”有一个链接。 将属性化文本安装到文本视图(或或,就此而言。)但是,当属性化文本包含链接时,它是不可单击的。 有没有办法让用户可读的文本可以在、或中单击? SO上的标记

  • 我试着做这个计算器,我可以用四种方法,一种是加法,一种是减法,还有.....但我想让它变得尽可能简单。我如何使用一个方法执行4个主要操作,然后在静态main中调用它? 可以将更改为()吗?(那部分是我有问题)

  • 我知道还有其他方法可以实现这一点,但我想通过initState()使用Future来使用SharedPreVP获取List。下面说明了我想要实现的目标,但它不能按要求工作,因为Future在完成任务之前立即返回。 这应该如何组织?