В этом example (RandomGifPair) как обновление, соответствующее NewGif, действительно подключено для выполнения после того, как родительский компонент запускает RandomGif.update act model.left
? Кажется, что RandomGif.update NewGif maybeUrl
нужно вручную уволить. Чтобы быть немного более явным, RandomGifPair запускает действие Left Left и возвращает пару модели/эффекта, вручную вызывая функцию обновления RandomGif. Возвращенный эффект осуществляется через Effects.map Left fx
, и переходит к функции getRandomGif в RandomGifElm Effects, сопоставленный с вложенным компонентом
getRandomGif : String -> Effects Action
getRandomGif topic =
Http.get decodeUrl (randomUrl topic)
|> Task.toMaybe
|> Task.map NewGif
|> Effects.task
, который, насколько я понимаю, будет продолжать стрелять действие NewGif, который, из-за эффектов. map, теперь также отмечен слева. Только часть картины я отсутствующая как это действие сохраняется в пределах RandomGif и действия, соответствующих случай NewGif этого обновления фактически обожженное:
update : Action -> Model -> (Model, Effects Action)
update action model =
case action of
RequestMore ->
(model, getRandomGif model.topic)
NewGif maybeUrl ->
(Model model.topic (Maybe.withDefault model.gifUrl maybeUrl)
, Effects.none
)
когда Main.elm имеет только обновление функция от RandomGifPair и, таким образом, не имеет случая для NewGif.
Я уверен, что ответ кроется в конкретных деталях портов, Effects.map, forwardTo или Tasks, которые мне не хватает.
Для справки, here is an attempt to solve the problem in javascript, который содержит запись в верхней функции обновления для NewGif и вручную вызывает RandomGif.update внутри нее. Вероятно, это не лучший способ попытаться понять вяза ...
О, я мог бы получить его. Позвольте мне спросить об этом: так что Left on line 42 обрабатывает оба действия RequestMore _and_ NewGif индивидуально и вызывает более низкое обновление для обоих действий? Удивительно просто. Таким образом, RequestMore изначально запускается как левое действие, которое в конечном итоге запускает NewGif, и оба обрабатываются в левом случае, когда обновление является агностическим, если это имеет смысл. –
Я собираюсь пойти, да, вот здесь. Очень просто, просто легко заблудиться в предполагаемой сложности архитектуры портов/эффектов. Спасибо, что пропустили меня через него. –
Большой момент для меня заключался в том, что такие вещи, как «Левые», фактически являются функциями. Похоже, ты понял! –