2017-08-22 1 views
0

Comment implémenter et retourner un message Cmd?Comment implémenter et renvoyer un Msg Cmd?

Par exemple, la ligne suivante génère un Cmd Msg:

Http.send msg request 

Il est utilisé dans la fonction suivante:

tryRegister : Form -> (Result Http.Error JsonProfile -> msg) -> Cmd msg 
tryRegister form msg = 
    let 
     registerUrl = 
      "http://localhost:5000/register" 

     body = 
      encode form |> Http.jsonBody 

     request = 
      Http.post registerUrl body decoder 
    in 
     Http.send msg request 

Je suis en train de coder manuellement une fonction similaire dans mon TestAPI:

tryRegister : Form -> (Result Http.Error JsonProfile -> msg) -> Cmd msg 
tryRegister form msg = 
    Cmd.none 

Le code ci-dessus iles. Cependant, il n'est pas clair pour moi comment implémenter une fonction qui renvoie un Msg Cmd autre que Cmd.none.

Annexe:

type Msg 
    = 
    ... 
    | Submit 
    | Response (Result Http.Error JsonProfile) 

update : Msg -> Form -> (Form, Cmd Msg) 
update msg model = 
    case msg of 
     ... 
     Submit -> 
      (model, runtime.tryRegister model Response) 

Source code on GitHub.

+0

N'a pas prendre connaissance de votre code, mais vous pourriez être en mesure de réaliser ce que vous » re essayant de faire sans commandes: https://medium.com/elm-shorts/how-to-turn-a-msg-into-a-cmd-msg-in-elm-5dd095175d84 – SwiftsNamesake

Répondre

1

Modifier

La réponse originale suggère la cartographie sur Cmd.none, qui compile et peut potentiellement être utile lorsque se moquant des fonctions de test, mais si vous êtes en train d'essayer de forcer un autre cycle update dans The Elm Architecture, vous devra être converti en Task, comme indiqué dans la fonction senddescribed here.

send : msg -> Cmd msg 
send msg = 
    Task.succeed msg 
     |> Task.perform identity 

Comme @SwiftsNamesake mentionné ci-dessus, dans la plupart des cas, ce n'est pas nécessaire, et le poste entier blog sur le sujet est worth a read.

originale Réponse

Vous pouvez utiliser Cmd.map sur Cmd.none pour le changer à tout Cmd:

Cmd.map (always Submit) Cmd.none