могу понять, что происходит при использовании Deferred. Посмотрел декомпилированный код и с Job стало понятнее, но не с Deferred. Может кто-нибудь объяснить или какую-нибудь статью/видео кинуть, ничего с разбором Deferred не нашел?
А что именно вас смущает в работе Deferred? Это обычный промис/фьючер, который можно саспенд-методом "дождаться".
Вот я и не могу понять как именно он его дожидается
https://habr.com/ru/post/421473/
Также как и при job ? Dеffered просто возвращает результат
Все просто, нужно понимать работают корутины. Под капотом, саспенд функции - стейт машина. Дальше идет работа скоупов и их иерархической отмены, то-есть корутины созданы в этом скоупе имеют "связь", в виде этого скоупа. Когда функция доходит до конца, то она "отправляет евент о завершении", последний этап стейт машины.
У Deferred стейт машина генерируется в BuilderKt$async$default и там ещё один label, чем он отличается от label до invokeSuspend, получается там две стейт машины для обработки состояния готовности результата и самой корутины?
Я не скажу, не смотрел. Но генерированый код не стоит сравнивать, он может быть разный а смысл один и тотже. Builder$adync$default - просто названия
await() ничем не отличается от join(), кроме того, что она возвращает не Unit, а что-то осмысленное. Смотреть во что это развернул компилятор - занятие, конечно, увлекательное, но не стоит делать из этого далеко идущие выводы.
Получается, если я возвращаю из async строку, то в результат Continuation попадет строка вместо Unit и пока я не вызову await, корутина будет приостановлена, даже если результат готов?
Если не брать в расчёт ленивый запуск, то эта корутина выполняется сама по себе, await() никак не влияет на неё. Просто из Deferred можно вытащить результат или дождаться его. А вообще Deferred реализует Job.
Обсуждают сегодня