2017-03-09 30 views
5

Próbuję zmodyfikować prostą aplikację z elm-lang tutorial, aby najpierw zaktualizować model, a następnie uruchomić inną aktualizację.Elm - Włącz Msg w Cmd Msg

update msg model = 
    case msg of 
    MorePlease -> 
     (model, getRandomGif model.topic) 

    NewGif (Ok newUrl) -> 
     ({ model | gifUrl = newUrl }, Cmd.none) 

    NewGif (Err _) -> 
     (model, Cmd.none) 

    -- my addition 
    NewTopic newTopic -> 
     ({ model | topic = newTopic}, MorePlease) 

ta zawodzi w kompilator, ponieważ oddział nowytemat:

The 3rd branch has this type: 

({ gifUrl : String, topic : String }, Cmd Msg) 

But the 4th is: 

({ gifUrl : String, topic : String }, Msg) 

Więc moja Msg musi być typu Cmd Msg. Jak mogę włączyć”mój błędzie w Cmd Msg

notatka: uznaję istnieje prostszy sposób, aby dokonać tej zmiany, ale staram się zrozumieć Elm bardziej fundamentalnie

Odpowiedz

13

Naprawdę nie ma trzeba włączyć Msg do Cmd Msg Pamiętaj, że update jest tylko funkcją, więc można nazwać rekurencyjnie

NewTopic Twój przypadek obsługi można uprościć do tego:..

NewTopic newTopic -> 
    update MorePlease { model | topic = newTopic} 

Jeśli naprawdę naprawdę chciał Elm Architecture wystrzelić Cmd dla tego scenariusza, można zrobić prosty map z Cmd.none do żądanego Msg:

NewTopic newTopic -> 
    ({ model | topic = newTopic}, Cmd.map (always MorePlease) Cmd.none) 

(faktycznie nie zalecane)

+0

Dziękuję Ci. Jest to łatwiejszy sposób rozwiązania problemu. Nadal zastanawiam się, czy kiedykolwiek będę musiał "rzucić" Msg na "Cmd Msg"? I jak bym to zrobił, gdybym to zrobił? – steel

+0

Zaktualizowałem swoją odpowiedź na przykładzie: –

+0

@ChadGilbert: Czy mógłbyś nieco więcej wyjaśnić, dlaczego nie poleciłbyś drugiej metody, uruchamiając nowe 'Msg'? – DanEEStar