飞镖-对期货列表进行排序

时间:2019-10-31 07:19:28

标签: sorting dart future

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

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

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

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

https://dartpad.dartlang.org/a5175401516dbb9242a0edec4c89fef6

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

2 个答案:

答案 0 :(得分:0)

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

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];
}

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

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

答案 1 :(得分:0)

Gentlfolk, 谢谢你的帮助。

julemand101使用Future.wait()的建议使我得到了答案。

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

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

Essentilly,当我们通过网络发出数据库请求时,我们得到了一个实体。 问题在于该实体经常会引用其他实体。 这可以以需要返回的整个实体树结束。 通常,您不需要任何这些实体。

因此,我们寻求的解决方案是仅返回每个子实体(仅直属子实体)的数据库“ id”。

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

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

当我们实际上需要访问子实体时,我们强制完成RefId(即跨网络边界检索实体)。 作为父级请求的一部分,我们有一个完整的缓存方案来保留该性能,并具有强制获取子元素的能力,在这种情况下,我们预先知道将需要它们。

我的示例中的选项本质上是需要排序的菜单项。 但是,当然,在检索到它们之前,我无法对其进行排序。 因此,一个重写的示例和答案:

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

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

https://dartpad.dartlang.org/ba892873a94d9f6f3924436e9fcd1b42

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

感谢您的帮助。