【问题标题】:dart - Sort a list of futuresdart - 对期货列表进行排序
【发布时间】:2019-10-31 07:19:28
【问题描述】:

所以我有一组选项,每个选项都包含一个表示它们的序数的 int 值。

这些选项存储在远程数据库中,每个选项都是一条记录。 因此,当我从数据库中获取它们时,我最终得到了一个未来列表: 例如List<Future<Option>>

我需要能够对这些选项进行排序。

以下飞镖垫显示了我要实现的目标的简化视图:

https://dartpad.dartlang.org/a5175401516dbb9242a0edec4c89fef6

期权必须是期货。 我最初的解决方案是将选项复制到列表中,“完成”它们,然后对列表进行排序。 然而,这导致了其他问题,因此我需要对原始列表进行“原位”排序。

【问题讨论】:

标签: sorting dart future


【解决方案1】:

您无法在期货完成之前对其进行排序,即使那样,您也需要先提取值。 如果您之后需要一份期货清单,我会这样做:

List<Future<T>> sortFutures<T>(List<Future<T>> input, [int compare(T a, T b)]) {
  var completers = [for (var i = 0; i < input.length; i++) Completer<T>()];
  Future.wait(input).then((values) {
    values.sort(compare);
    for (int i = 0; i < values.length; i++) {
      completers[i].complete(values[i]);
    }
  });
  return [for (var c in completers) c.future];
}

这不会退回原始期货,因为您在必须退回它们时不知道订单。它确实返回具有相同值的期货。

如果任何期货以错误完成,那么这会爆炸。如果可能的话,您将需要更多的错误处理。

【讨论】:

    【解决方案2】:

    绅士们, 感谢您的帮助。

    使用 Future.wait() 的 julemand101 建议引导我找到答案。

    这也帮助我更好地理解问题。

    我做了一个新的要点,更准确地显示了我正在尝试做的事情。

    本质上,当我们通过网络执行数据库请求时,我们会返回一个实体。 问题是实体通常会引用其他实体。 这可以以需要返回的整个实体树结束。 通常您不需要任何这些实体。

    所以我们寻求的解决方案是只返回每个子实体的数据库“id”(只返回直接子实体)。

    然后我们将这些 id 存储在类 RefId 中(见下文)。

    RefId 本质上是一个future,它具有实体 id 并知道如何从数据库中获取实体。

    当我们真正需要访问子实体时,我们会强制 RefId 完成(即跨网络边界检索实体)。 我们有一个完整的缓存方案来保持这种性能以及强制获取子元素的能力,作为父请求的一部分,我们预先知道它们将被需要。

    我示例中的选项本质上是需要排序的菜单项。 但是,在它们被检索之前,我当然不能对它们进行排序。 所以一个重写的例子和答案:

    https://dartpad.dartlang.org/369e71bb173ba3c19d28f6d6fec2072a

    这是我们实际使用的 IdRef 类:

    https://dartpad.dartlang.org/ba892873a94d9f6f3924436e9fcd1b42

    它现在有一个静态的resolveList 方法来帮助解决这类问题。

    感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      • 2022-07-26
      • 2013-09-06
      • 2012-10-04
      相关资源
      最近更新 更多