Go цикл alt!выполнит любой блок в зависимости от того, на каком канале есть сообщение.
Вы заметите, что stop-ch не повторяется, и поэтому после получения остановки цикл go завершится.
Есличто-то получено на канале слушателя, это обрабатывается функцией f.Затем повторение возвращает нас к началу цикла go, где alt!будет ожидать дальнейших сообщений либо на слушателе, либо на канале остановки.
Созданная структура слушателя представляет собой карту из двух каналов - поместите вещи в слушатель, и они будут найдены, что-нибудь положит на остановку ислушатель остановится.Эта заключительная деталь затем абстрагируется для пользователя стоп-слушателем fn.
Все это, по сути, всего лишь простой адаптер между каналом core.async и функцией с логикой очистки.
И означает ли, что go-loop означает, что после вызова функции слушателя она будет ждать неопределенное время для получения значений?
Нет.Вызов слушателя не заблокирует поток управления.Однако созданная петля go будет «блокироваться» до тех пор, пока не получит вход по одному из каналов.Я использую кавычки, потому что это не заблокированный поток - я действительно рекомендую вам взглянуть на некоторые основные презентации core.async после того, как вы сыграете на REPL.Как только вы можете связать поведение с теорией, это довольно просто.