Во-первых: нужно явно отделить механизмы ожидания инита компонента, и ожидания события в каком-то компоненте.
Для событий - любой реализуемый механизм (калбеки/события/промисы etc)
Для ожидания инита компонента - реализация в механизме компоннентов в виде Components.await(node, componentName) -> Promise
Почему bloko/common/ready плохо:
- bloko никак не связан с нашей структурой, и не должен завязываться на наши особенности инициализации компонентов, блоко должен предоставлять независимые модули, которые будут инититься синхронно по зависимостям.
- инициализация должна быть синхронная, следовательно нам не нужен вообще bloko/common/ready для ожидания готовности блоко модуля.
- следовательно нам не нужно знать имя промиса который торчит из независимого блока (не надо заглядывать в блоко)
- bloko/common/ready предоставляет фарш возможностей, из-за этого получается дырявая абстракция механизма, без явного понимания что делает конкретно тут этот инструмент.
Почему Components.await хорошо:
- Недетерминированный порядок инициализации компонентов, это особенности Components, эта особенность должна разруливаться его же средствами
- У нас уже есть в Components промис который отвечает за окончание инициализации компонента (нужен для init().done)
- У нас уже есть имя с которым надо "создавать" промис, имя компонента, не нужно как в случае с ready, сначала создать промис с каким-то именем, а потом его уже использовать.
Получается явная схема ожидания компонента - ожидание готовности конкретного компонента на конкретной ноде, а в калбеке - уже работа по взаимодействию, написаная средствами по взаимодействию.
Как дождаться готовности нескольких компонентов?