Как узнать, завершено ли определенное будущее, избегая цепочки будущих в качестве возвращаемых типов?

Сценарий

Если я хочу прочитать из файла и сохранить данные на карте, и если эта карта используется несколько раз для проверки.

Могу ли я сделать это без изменения возвращаемого типа всех методов, использующих вышеупомянутую карту, на Future?

Пример:

Map metadata = null
Future readFromFile async {
 .... metadata = await File.readingfromFile(...);
}

Future getRegion(..) async {
  if(metadata == null) { await readFromFile() }
  return metadata["region"]
}

Используя приведенный выше код, если метод (например, isValidRegion и т. д.), который использует и требует завершения getRegion(..), тогда возвращаемый тип isValidRegion должен быть преобразован в Future.

Future<bool> isValidRegion(..) async {
   return ((await getRegionData(...)) != null )
}

Если этот isValidRegion присутствует в других методах, то их возвращаемый тип также должен быть изменен на Future.

Future<String> parse(...) async {
   ....
   if(await isValidRegion()) {
    ...
    }
...
}

Каков элегантный способ избежать этой цепочки фьючерсов в качестве возвращаемых типов?


person Eternalcode    schedule 05.07.2016    source источник


Ответы (1)


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

Что вы можете сделать, так это выполнить чтение из файла синхронно, чтобы избежать проблемы в первую очередь (если это возможно, если вы читаете его из сетевого подключения, это может быть невозможно).

person Günter Zöchbauer    schedule 06.07.2016
comment
Есть отличная статья Боба Нистрома о заразности асинхронности: journal.stuffwithstuff.com/2015/02/01/. Другими словами, да, это проблема, и вы ничего не можете с этим поделать. - person filiph; 06.07.2016
comment
Интересно. Спасибо за ответы. Мне интересно, как другие крупные библиотеки справляются с чтением из файлов и избегают заразности. Возможно, мне придется найти его и исследовать. - person Eternalcode; 07.07.2016