насколько я помню этот код ещё и работает не так, как ты ожидаешь. coroutineScope не завершится пока все корутины, что были в ней запущены, не завершатся
как верно человек выше сказал - переменная delayJob всегда будет налл, только один условный тик она будет джобой, которая уже завершилась. кроме того, зачем нужно создавать coroutineScope, когда он и так сделается в async? delayJob = async { delay(...) } delayJob?.await() delayJob = null ну и туда лучше мьютекс поставить или убедиться, что при многопотоке там ричего не сломается
async это экстеншн скоупа. Если код автора зовётся из простой suspend функции, то он не сможет позвать просто async. Ну и coroutineScope не возвращает job. Он вернёт результат блока. В остальном верно)
Потому, что это suspend метод и там просто так async не создаётся и я уже проверил, этот код работает)
да. Он работает, но вы получаете deferred когда он уже завершился. То есть у вас нет асинхронности с остальным кодом suspend функции, так как всё встаёт колом, пока содержимое coroutineScope выполняется
Ну это мне и нужно
вряд-ли. coroutineScope { /* async stuff */ } примерно равно coroutineScope { async { /* async stuff */ } } т.к. второй сниппет запустит и дождётся пока этот асинк выполнится
а, интересно, то есть coroutineScope ждёт окончания любой job, даже если это async
coroutineScope {} функция - да
Обсуждают сегодня