在javascript ES6中我会这样做
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));
}
解决方法
CompletableFuture#allOf方法不公开传递给它的已完成CompletableFuture实例的集合.
Returns a new
CompletableFuturethat is completed when all of the
givenCompletableFutures complete. If any of the given
CompletableFutures complete exceptionally,then the returned
CompletableFuturealso does so,with aCompletionExceptionholding
this exception as its cause. Otherwise,the results,if any,of the
givenCompletableFutures are not reflected in the returned
CompletableFuture,but may be obtained by inspecting them
individually. If noCompletableFutures are provided,returns a
CompletableFuturecompleted with the valuenull.
请注意,allOf还会考虑已完成的特殊期货.所以你不会总是有一个人可以使用.你可能实际上有一个异常/ throwable.
如果您知道正在使用的CompletableFutures的数量,请直接使用它们
CompletableFuture.allOf(p1,p2).thenAccept(it -> { Person person1 = p1.join(); Person person2 = p2.join(); });
如果你不知道你有多少(你正在使用数组或列表),只需捕获传递给allOf的数组
// 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(); } });
如果你想要你的combinePersons方法(现在忽略它是@Test)来返回包含完成的期货中所有Person对象的Person [],你可以做
@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);
}

