Замените Future.then () на async / await - PullRequest
0 голосов
/ 18 января 2019

Я всегда считал async / await более элегантным / сексуальным по сравнению с Futures API, но теперь я столкнулся с ситуацией, когда реализация Future API очень коротка и лаконична, а альтернатива async / await кажется многословной и безобразной.

Я отметил свои два вопроса № 1 и № 2 в комментариях:

class ItemsRepository
{
  Future<dynamic> item_int2string;

  ItemsRepository() {
    // #1
    item_int2string = 
     rootBundle.loadString('assets/data/item_int2string.json').then(jsonDecode);
  }

  Future<String> getItem(String id) async {
    // #2
    return await item_int2string[id];
  }
}

# 1: Как я могу использовать здесь async / await вместо Future.then ()? Какое самое элегантное решение?

# 2: Эффективно ли это, если метод вызывается много раз? Сколько накладных расходов ожидает добавления? Должен ли я сделать разрешенное будущее переменной экземпляра, иначе

completedFuture ??= await item_int2string;
return completedFuture[id];

1 Ответ

0 голосов
/ 18 января 2019

1: Как я могу использовать здесь async / await вместо Future.then ()? Какое самое элегантное решение?

асинхронные методы заразны. Это означает, что ваш метод ItemsRepository должен быть асинхронным, чтобы использовать await внутри. Это также означает, что вы должны вызывать его асинхронно из других мест. Смотрите пример:

Future<dynamic> ItemsRepository() async {
    // #1
    myString = await rootBundle.loadString('assets/data/item_int2string.json');
    // do something with my string here, which is not in a Future anymore...
  }

Обратите внимание, что использование .then - это то же самое, что и ожидание в асинхронной функции. Это просто синтаксический сахар. Обратите внимание, что вы будете использовать .then иначе, чем в вашем примере:

  ItemsRepository() {
    // #1

     rootBundle.loadString('assets/data/item_int2string.json').then((String myString) {
       // do something with myString here, which is not in a Future anymore...
     });
  }

И для # 2 не беспокойтесь о влиянии асинхронного кода на производительность. Код будет выполняться с той же скоростью, что и синхронный код, чуть позже, когда произойдет обратный вызов. Единственная причина, по которой существует асинхронность, заключается в простом способе продолжения работы кода, пока система ожидает возврата асинхронно вызываемой части. Например, не блокируйте пользовательский интерфейс, ожидая, пока диск загрузит файл.

Я рекомендую вам прочитать основные документы об асинхронности в Dart .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...