所以我有一组选项,每个选项都包含一个代表其序数的int值。
这些选项存储在远程数据库中,每个选项都是一条记录。
这样,当我从数据库中获取它们时,我会得到一个将来的列表:
例如List<Future<Option>>
我需要能够对这些选项进行排序。
以下飞镖垫显示了我要实现的目标的简化视图:
https://dartpad.dartlang.org/a5175401516dbb9242a0edec4c89fef6
期权必须是期货。 我最初的解决方案是将“选项”复制到列表中,“完成”它们,然后对列表进行排序。 但是,这引起了其他问题,因此我需要对原始列表进行“原位”排序。
答案 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
方法来解决此类问题。
感谢您的帮助。