等待监听器完成内部循环[复制]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了等待监听器完成内部循环[复制]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我正在开发一个java方法,它接收一个项目列表,生成每个项目的报告(PDF文件),最后将所有这些PDF文件压缩成一个zip文件。

这是我的简化方法:

List<File> pdfs = new ArrayList<File>();

public void generateZipOfItems(List<Item> items) {
  for(Item item : items) {
    ReportThread report = generatePDFReport(item);

    report.addListener(new ReportExecuteListener() {
      @Override
      public void finishReport(ReportExecutionEvent reportExecutionEvent) {
         // when report is finished, add the PDF file on arrayList
         pdfs.add(reportExecutionEvent.getReport());
      }
  }

  createZipFromFileList(pdfs); // this method just zip the files, and it is working very well

}

在完美的场景中,该方法应该生成项目A的报告,将其添加到“pdfs”数组并重复项目B,C等。最后,对于阵列上的所有pdfs,它应该压缩文件。

问题是,循环不等待监听器完成生成报告文件,并且正在创建没有项目的zip文件。

循环应该在迭代之前等待监听器。我怎样才能做到这一点?

答案

我会使用并行流。就像是:

 createZipFileFromFileList(items.parallelStream()
                                .map(item -> generatePDFReport(item))
                                .collect(Collectors.toList()));

编辑:在这个重构中,generatePDFReport()将返回生成的PDF对象本身,而不是ReportThread

以上是关于等待监听器完成内部循环[复制]的主要内容,如果未能解决你的问题,请参考以下文章

等待内部带有承诺的 forEach 完成

等待侦听器完成

片段 - 全局视图变量与本地和内部类侦听器和内存泄漏

Javascript等待Promise在返回响应之前完成for循环

如何在while循环spritekit内部生成之前等待

当我使用 for 循环时,为啥我的代码没有在 forEach 中等待? [复制]