-
Notifications
You must be signed in to change notification settings - Fork 341
Description
In the 2016 futures announcement post, the join combinator was shown as something that would make choosing between several futures easy.
In rust-lang/futures-rs#1215 and beyond this was changed to several methods: join, join1, join2, join3, and join!, try_join macros (proc macros since 0.3.0-alpha.18 so statements can be written inline).
Future::join
It still seems incredibly useful to be able to join multiple futures together, and having a single combinator to do that seems like the simplest API, even if resulting code might not look completely symmetrical. I propose we add Future::join:
use async_std::future;
let a = future::ready(1);
let b = future::ready(2);
let pair = a.join(b);
assert_eq!(pair.await, (1, 2));Future::try_join
The futures-preview library also exposes a try_join method. This is useful when you want to unwrap two results. Internally it uses TryFuture as a reference, which means this method should only exist on futures where Output = Result<T, E>, and I'm not entirely sure if that's feasible. However if it is it might be convenient to also expose:
use async_std::future;
let a = future::ready(Ok::<i32, i32>(1));
let b = future::ready(Ok::<i32, i32>(2));
let pair = a.try_join(b);
assert_eq!(pair.await, Ok((1, 2)));Future::join_all
The third join combinator present is Future::join_all. The docs don't make a big sell on them (inefficient, set can't be modified after polling started, prefer futures_unordered), but it's probably still worth mentioning. I don't think we should add this combinator, but instead point people to use fold instead:
don't do this
use async_std::future::join_all;
async fn foo(i: u32) -> u32 { i }
let futures = vec![foo(1), foo(2), foo(3)];
assert_eq!(join_all(futures).await, [1, 2, 3]);do this instead
let futures = vec![foo(1), foo(2), foo(3)];
let futures = futures.fold(|p, n| p.join(n))
assert_eq!(futures.await, [1, 2, 3]);note: not tested this, but in general I don't think we need to worry about this case too much as handling the unordered case seems much more important and would cover this too.