Asynchronous 我怎样才能像join_all那样将所有未来加入一个向量,而不在失败时取消?

Asynchronous 我怎样才能像join_all那样将所有未来加入一个向量,而不在失败时取消?,asynchronous,rust,async-await,Asynchronous,Rust,Async Await,我通过调用一个async函数创建了一个Vec。在将所有的未来添加到向量之后,我想等待整个集合,获取结果列表,或者对每个完成的结果进行回调 我可以简单地循环或迭代期货向量,并在每个期货上调用。wait,这将允许我正确处理错误,而不必取消其他错误,但我相信有一种更惯用的方法来完成这项任务 我还希望能够在期货交易完成时处理期货交易,因此,如果我从前几笔交易中获得足够的信息,我可以取消剩余的未完成期货交易,而不是等待它们,并放弃它们的结果,不管是否有错误。如果我按顺序迭代向量,这是不可能的 我正在寻找的

我通过调用一个
async
函数创建了一个
Vec
。在将所有的未来添加到向量之后,我想等待整个集合,获取结果列表,或者对每个完成的结果进行回调

我可以简单地循环或迭代期货向量,并在每个期货上调用
。wait
,这将允许我正确处理错误,而不必取消其他错误,但我相信有一种更惯用的方法来完成这项任务

我还希望能够在期货交易完成时处理期货交易,因此,如果我从前几笔交易中获得足够的信息,我可以取消剩余的未完成期货交易,而不是等待它们,并放弃它们的结果,不管是否有错误。如果我按顺序迭代向量,这是不可能的

我正在寻找的是一个回调(闭包等),它允许我在结果出现时累积结果,以便我可以适当地处理错误,或者在我确定不需要其余结果时取消剩余的结果(从回调中)

我可以看出,这让借用检查器头疼:试图在异步引擎的回调中修改
Vec
中的未来

有许多堆栈溢出问题和Reddit帖子解释了如何在未来列表中加入所有的连接,但如果其中一个失败,将取消其余的连接,以及异步引擎如何产生线程,或者它们可能不产生线程,或者如果产生线程,它们是糟糕的设计。

使用:

use futures::future;//0.3.4

键入Error=box很难回答您的问题,因为它没有包含一个。我们无法说出代码中存在哪些板条箱(及其版本)、类型、特征、字段等。如果您试图重现您的错误(如果可能的话),或者在全新的货运项目中,那么我们将更容易帮助您,然后您的问题将包括附加信息。您可以使用以下方法减少在此处发布的原始代码。谢谢没有错误。我没有提供代码示例,因为我还没有。我不知道如何解决这个问题,所以我才这么问。我不是在问“如何修正错误”,我是在问如何解决这个问题,因为我找不到任何工具似乎能满足我的需要。这表明你仍处于研究阶段。另一个问题是,不清楚您提到的是哪个
join\u all
。值得一提的是,我找到的
join_all
就是
futures
板条箱中的一个,但由于它对未来的项目不可知,如果其中一个项目出现错误,它不会取消现有的futures。我没有提供代码示例,因为我还没有代码示例。vs我通过调用
async
函数创建了一个
Vec
期货-后者表示您有选择不共享的代码。@E\u Net4将帮助您在失败时取消其他期货。
use futures::future; // 0.3.4

type Error = Box<dyn std::error::Error + Send + Sync + 'static>;
type Result<T, E = Error> = std::result::Result<T, E>;

async fn might_fail(fails: bool) -> Result<i32> {
    if fails {
        Ok(42)
    } else {
        Err("boom".into())
    }
}

async fn many() -> Result<i32> {
    let raw_futs = vec![might_fail(true), might_fail(false), might_fail(true)];
    let unpin_futs: Vec<_> = raw_futs.into_iter().map(Box::pin).collect();
    let mut futs = unpin_futs;

    let mut sum = 0;

    while !futs.is_empty() {
        match future::select_all(futs).await {
            (Ok(val), _index, remaining) => {
                sum += val;
                futs = remaining;
            }
            (Err(_e), _index, remaining) => {
                // Ignoring all errors
                futs = remaining;
            }
        }

        if sum > 42 {
            // Early exit
            return Ok(sum);
        }
    }

    Ok(sum)
}