дартс - сортировка списка фьючерсов - PullRequest
0 голосов
/ 31 октября 2019

Итак, у меня есть набор параметров, каждый из которых содержит значение типа int, представляющее их порядковый номер.

Эти параметры хранятся в удаленной базе данных, причем каждый параметр является записью. Таким образом, когда я получаю их из базы данных, я получаю список будущего: например, List<Future<Option>>

Мне нужно иметь возможность отсортировать эти параметры.

На следующей панели дартс показанупрощенное представление о том, чего я пытаюсь достичь:

https://dartpad.dartlang.org/a5175401516dbb9242a0edec4c89fef6

Опционы ДОЛЖНЫ быть фьючерсами. Моим исходным решением было скопировать параметры в список, «завершить» их, а затем отсортировать список. Это, однако, вызвало другие проблемы, и поэтому мне нужно сделать сортировку «insitu» в исходном списке.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Gentlfolk, спасибо за помощь.

Предложение julemand101 об использовании Future.wait () привело меня к ответу.

Это также помогло мне лучше понять проблему.

Я сделал новую суть, которая более точно показывает, что я пытался сделать.

По существу, когда мы делаем запрос БД по сети, мы получаем сущность обратно. Проблема в том, что у сущности часто будут ссылки на другие сущности. Это может закончиться целым деревом сущностей, которые необходимо вернуть. Часто вам не нужны никакие из этих сущностей.

Таким образом, решение, к которому мы пошли, состоит в том, чтобы возвращать только идентификатор базы данных каждой дочерней сущности (только непосредственных потомков).

Мызатем сохраните эти идентификаторы в классе RefId (см. ниже).

RefId - это, по сути, future, который имеет идентификатор сущности и знает, как извлечь сущность из БД.

Когда нам действительно необходим доступ к дочерней сущности, мы заставляем RefId:завершить (т.е. извлечь объект через границу сети). У нас есть целая схема кэширования, позволяющая поддерживать эту производительность, а также возможность принудительного извлечения дочерних элементов в рамках родительского запроса, где мы заранее знаем, что они будут необходимы.

Параметры в моемПримером по сути являются пункты меню, которые необходимо отсортировать. Но, конечно, я не могу отсортировать их, пока они не будут найдены. Итак, переписанный пример и ответ:

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

Вот фактический класс IdRef, который мы используем:

https://dartpad.dartlang.org/ba892873a94d9f6f3924436e9fcd1b42

Это сейчасесть статический метод resolveList, чтобы помочь с этим типом проблемы.

Спасибо за вашу помощь.

0 голосов
/ 31 октября 2019

Вы не можете сортировать фьючерсы до того, как они завершены, и даже тогда вам нужно сначала извлечь значения. Если после этого вам понадобится список фьючерсов, я бы сделал следующее:

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

Это не возвращает исходные фьючерсы, потому что вы не знаете порядок в тот момент, когда вам нужно их вернуть. ,Он возвращает фьючерсы, которые заканчиваются с тем же значением.

Если какой-либо из фьючерсов завершается с ошибкой, то это взрывается. Вам потребуется больше обработки ошибок, если это возможно.

...