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

如何访问传递到CompletableFuture的已完成期货?

缪嘉志
2023-03-14
Promise.all([p1, p2]).then(function(persons) {
   console.log(persons[0]); // p1 return value     
   console.log(persons[1]); // p2 return value     
});

到目前为止我在Java方面的努力

public class Person {

        private final String name;

        public Person(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

    }

@Test
public void combinePersons() throws ExecutionException, InterruptedException {
    CompletableFuture<Person> p1 = CompletableFuture.supplyAsync(() -> {
        return new Person("p1");
    });

    CompletableFuture<Person> p2 = CompletableFuture.supplyAsync(() -> {
        return new Person("p1");
    });

    CompletableFuture.allOf(p1, p2).thenAccept(it -> System.out.println(it));

}

共有1个答案

卢英叡
2023-03-14

CompletableFuture#Allof方法不公开传递给它的已完成的CompletableFuture实例的集合。

返回一个新的completablefuture,该值在给定的completablefuture全部完成时完成。如果给定的CompletableFuture中的任何一个异常完成,则返回CompletableFuture也会完成,其中CompletionException将此异常作为其原因。否则,给定的completablefuture的结果(如果有的话)不会反映在返回的completablefuture中,而是可以通过单独检查它们来获得。如果未提供completablefuture,则返回一个completablefuturecompleted值为null

请注意,allof还将例外完成的期货视为已完成。因此,您并不总是需要与人员一起工作。您实际上可能有一个异常/可抛出。

CompletableFuture.allOf(p1, p2).thenAccept(it -> {
    Person person1 = p1.join();
    Person person2 = p2.join();
});
// make sure not to change the contents of this array
CompletableFuture<Person>[] persons = new CompletableFuture[] { p1, p2 };
CompletableFuture.allOf(persons).thenAccept(ignore -> {
   for (int i = 0; i < persons.length; i++ ) {
       Person current = persons[i].join();
   }
});
@Test
public Person[] combinePersons() throws Exception {
    CompletableFuture<Person> p1 = CompletableFuture.supplyAsync(() -> {
        return new Person("p1");
    });

    CompletableFuture<Person> p2 = CompletableFuture.supplyAsync(() -> {
        return new Person("p1");
    });

    // make sure not to change the contents of this array
    CompletableFuture<Person>[] persons = new CompletableFuture[] { p1, p2 };
    // this will throw an exception if any of the futures complete exceptionally
    CompletableFuture.allOf(persons).join();

    return Arrays.stream(persons).map(CompletableFuture::join).toArray(Person[]::new);
}
 类似资料:
  • 我研究了以下代码:如何组合3个或多个CompletionStages?,但在这篇文章中,只有来自CompletableFutures的已完成任务被组合。 我如何将异步的CompletableFuture与Complted CompletableFuture相结合,以便将已经完成的CompletableFuture的结果与尚未计算结果的结果相结合?

  • 已完成未来() 返回已使用给定值完成的。 我们如何构造一个已经异常完成的< code>CompletableFuture? 也就是说,我希望future抛出一个异常,而不是返回值。

  • 现在,我有三个函数:updateFieldFromCollection1()、

  • 问题内容: 我正在Java 8中使用Completable futures,并且我想编写一种方法,该方法基于接收到的参数并行运行多个具有副作用的任务,然后返回其“组合” future(使用),或者什么都不做,然后返回已经完成的未来。 但是,返回一个: 创建已知的已经完成的未来的唯一方法是使用,它需要一个值: 返回一个已经用给定值完成的新CompletableFuture。 并且是无法实例化的,因此

  • 我在java 8中使用Completable futures,我想写一个方法,根据收到的参数,或者并行运行多个具有副作用的任务,然后返回它们的“组合”未来(使用),或者什么都不做,返回一个已经完成的未来。 但是,返回一个

  • 我可以使用firebase-admin通过nodejs将一个文件上传到我的firebase存储桶,但当我进入firebase UI时,我无法打开该文件。我注意到,通过firebase UI上传的文件将自动生成访问令牌,但对于通过NodeJS上传的文件没有。 我已经尝试了几种方法,比如用DownloadToken设置元数据,并在上传后将文件公开。没有一个起作用。 我如何通过API调用生成访问令牌,而