Щось мене поплавило асинхронне програмування в Dart. Скажіть в інших мовах (pyton на приклад) теж є такі граблі?
Є певний клас, який при ініціалізації (виклику конструктора) має за задумом зчитати конфіг і повернути свій інстанс, з цим конфігом всередині, так би мовити.
Але наявні бібліотеки надають інтерфейс для зчитування файлів у асинхронному режимі (оце щойно задумався, що може є альтернативні версії функції... перевірю)... значить, я знайшов на даний момент лише асинхронні функції для зчитування файлів.
Тож, якщо я викликаю асинхронну версію, то я не можу дочекатися результату зчитування і повертаю інстанс, який ще не містить конфігу всередині, програма продовжує виконуватись і коли їй потрібен той конфіг, вона знаходить там ніфіга.
Якщо я хочу поставити await перед викликом асинхронної функції, то я маю і сам конструктор зробити асинхронним, але цього не можна робити. Можна трохи позаморочуватись з фабрикою, яка викличе приватний конструктор, а далі буде викликати асинхронну функцію, однак, все одно доведеться весь каскад функцій аж до main включно робити асинхронними... для мене це якось виглядає дико.
Думав, можна якось обійти цю шнягу за допомогою змінної, методу Future.then і циклу while, але ні - доки не виконається весь синхронний код, асинхронний не буде оброблятися, тож оте while заблокує виконання асинхронної частини... і жодне sleep() не допоможе... не існує в Dart'і жодного способу дати виконати якісь інші справи, доки ти чекаєш у циклі певного результату.
Єдине спасіння може бути, це наявність синхронних версій функцій для роботи з файлами/мережею і т. п. - на момент, коли починав писати, ще про таку версію не думав. Зараз погуглю.