рд╣рдо рдПрд▓реНрдо 0.18 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред
рдПрд▓реНрдоред рдЖрд░рд╛рдорджрд╛рдпрдХ рдФрд░ рдЕрдЬреАрдм
рдПрд▓реНрдоред рдЖрд░рд╛рдорджрд╛рдпрдХ рдФрд░ рдЕрдЬреАрдмред рд░рдЪрдирд╛
рдПрд▓реНрдоред рдЖрд░рд╛рдорджрд╛рдпрдХ рдФрд░ рдЕрдЬреАрдмред Json.Encoder рдФрд░ Json.Decoder
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рдореБрджреНрджреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
рдХреНрд╡реЗрд░реА рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди
Http рдкреИрдХреЗрдЬ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╕рд░рд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдиреБрд░реЛрдз рдкреНрд░рдХрд╛рд░ Http.Request a рд╣реИ ред
рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рдгрд╛рдо Http.Error a рд╣реИред
рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдбрд┐рдХреЛрдбрд░ рдХреЛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╕рдордп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- Http.send;
- Http.toTaskред
Http.send рдЖрдкрдХреЛ рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдкрд╣рд▓реЗ рддрд░реНрдХ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрдкрдбреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред рд╕рдВрджреЗрд╢ рдЕрдиреБрд░реЛрдз рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рд╡рд╣рди рдХрд░рддрд╛ рд╣реИред
Http.toTask рдЖрдкрдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рд╕реЗ рдПрдХ рдЯрд╛рд╕реНрдХ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Http.toTask рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рд╕реНрдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Task.map2 ред
рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓рдЧрд╛рддрд╛рд░ рджреЛ рдЖрд╢реНрд░рд┐рдд рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдПрдХ рдкреЛрд╕реНрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдлрд╝реЛрдЯреЛ рдХреЛ рдЙрд╕реЗ рд╕рд╣реЗрдЬрдиреЗ рджреЗрдВ (рдХреБрдЫ CDN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, Http.Send рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
save : UserData -> Request Http.Error UserData save userData = Http.post тАЬ/some/urlтАЭ (Http.jsonBody (encodeUserData userData)) decodeUserData saveImages : Int -> Images -> Request Http.Error CDNData saveImages id images = Http.post (тАЬ/some/cdn/for/тАЭ ++ (toString id)) (imagesBody images) decodedCDNData
UserData рдФрд░ CDNData рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди encodeUserData рдПрдХ рдПрдирдХреЛрдбрд░ рд╣реИред saveImages рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрддрд╛ рдмрдирд╛рдиреЗ рдФрд░ рдлрд╝реЛрдЯреЛ рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред ImagesBody рдлрд╝рдВрдХреНрд╢рди рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ / рдлреЙрд░реНрдо-рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдмрдирд╛рддрд╛ рд╣реИ ред DecodeUserData рдФрд░ decodedCDNData рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреНрд░рдорд╢рдГ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдФрд░ CDN рдЕрдиреБрд░реЛрдз рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рджреЛ рд╕рдВрджреЗрд╢ рдЪрд╛рд╣рд┐рдП, рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдо:
type Msg = DataSaved (Result Http.Error UserData) | ImagesSaved (Result Http.Error CDNData)
рдорд╛рди рд▓реАрдЬрд┐рдП, рдЕрдкрдбреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХрд╣реАрдВ рди рдХрд╣реАрдВ, рдХреЛрдб рдХрд╛ рдПрдХ рдЦрдВрдб рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
update : Msg -> Model -> (Model, Cmd Msg) update msg model case Msg of ClickedSomething -> (model, Http.send DataSaved (save model.userData))
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдПрдХ рдХреНрд╡реЗрд░реА рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ рдФрд░ рдПрдХ DataSaved рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:
update : Msg -> Model -> (Model, Cmd Msg) update msg model case Msg of DataSaved (Ok userData) -> ( {model | userData = userData}, Http.send ImagesSaved (saveImages userData.id model.images)) DataSaved (Err reason) -> (model, Cmd.None)
рд╕рдлрд▓ рдмрдЪрдд рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдореЙрдбрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрди рддрд╕реНрд╡реАрд░реЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред ImagesSaved рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ DataSaved рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛, рд╕рдлрд▓ рдФрд░ рдЕрд╕рдлрд▓ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред
рдЕрдм Http.toTask рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдПрдХ рдирдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
saveAll : UserData -> Images -> Task Http.Error (UserData, CDNData) saveAll : userData images = save model.userData |> Http.toTask |> Task.andThen (\newUserData -> saveImages usersData.id images |> Http.toTask |> Task.map (\newImages -> (userData, newImages) } )
рдЕрдм, рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдПрдХ рд╕рдВрджреЗрд╢ рдореЗрдВ рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
type Msg = Saved (Result Http.Error (UserData, CDNData)) update : Msg -> Model -> (Model, Cmd Msg) update msg model case Msg of ClickedSomething -> (model, Task.attempt Saved (saveAll model.userData model.images)) DataSaved (Ok (userData, images)) -> ( {model | userData = userData, images = images}, Cmd.none) DataSaved (Err reason) -> (model, Cmd.None)
рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЯрд╛рд╕реНрдХ.рдЯреЗрдордкреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЯрд╛рд╕реНрдХ.рдлреЙрд░реНрдо рдлрдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рд╣реЛрдиреЗ рдХреА рдирд╣реАрдВред рдЯрд╛рд╕реНрдХ.рдлреЙрд░реНрдо - рдЖрдкрдХреЛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ ред Task.attempt - рдРрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ ред
рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рдЕрдкрдбреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рддрд░реНрдХ рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдерд╛рдиреАрдп рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ, рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдФрд░ рдШрдЯрдХреЛрдВ рдореЗрдВ, рдореИрдВ рдЕрдХреНрд╕рд░ Commands.elm рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рднрд╛рдЧ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реВрдВ ... -> рдЯрд╛рд╕реНрдХ Http.Error aред
рдЕрдиреБрд░реЛрдз рд╕реНрдерд┐рддрд┐
рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрдХреНрд╕рд░ рдкреВрд░реЗ рдпрд╛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╡рд░реБрджреНрдз рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рднреА рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдХреЛрдИ рд╣реЛред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЕрдиреБрд░реЛрдз рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ;
- рдЕрдиреБрд░реЛрдз рдЬрд╛рд░реА рд╣реИ;
- рдЕрдиреБрд░реЛрдз рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
- рдЕрдиреБрд░реЛрдз рд╡рд┐рдлрд▓ рд░рд╣рд╛ред
рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд░рд┐рдореЛрдЯрдбрд╛рдЯрд╛ рдкреИрдХреЗрдЬ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╕рдордп рдХреЗ рд╕рд╛рде, рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреА рд╡реЗрдмрдбреЗрдЯрд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдмреЗрдорд╛рдиреА рд╣реЛ рдЧрдИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдердХрд╛рдК рдерд╛ред рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЗ рдмрдЬрд╛рдп, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдо рджрд┐рдЦрд╛рдИ рджрд┐рдП:
- рд╢рд╛рдпрдж рд╕рд░реНрд╡рд░ рд╕реЗ рд╕рднреА рдбреЗрдЯрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреБрдЫ рднреА рдирд╣реАрдВ, рдбреЗрдЯрд╛ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ;
- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╛ рдШрдЯрдХ рдореЙрдбрд▓ рдореЗрдВ Int рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рд▓реЛрдбрд┐рдВрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВред рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдПрдХрдорд╛рддреНрд░ рдЕрд╕реБрд╡рд┐рдзрд╛ рдХреНрд░рдорд╢рдГ рдЕрдиреБрд░реЛрдз рдХреЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдФрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдФрд░ рдШрдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ;
- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╛ рдХрдВрдкреЛрдиреЗрдВрдЯ рдореЙрдбрд▓ рдореЗрдВ рдЯрд╛рдЗрдк рд▓рд┐рд╕реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рддреНрд░реБрдЯрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВред рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рддреНрд░реБрдЯрд┐ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд░реНрдгрд┐рдд рдпреЛрдЬрдирд╛ рд░рд┐рдореЛрдЯрдбрд╛рдЯрд╛ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рд╕реЗ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред
рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрди рд╕реНрдерд┐рддрд┐ рдореЗрдВ Http.Progress рдкреИрдХреЗрдЬ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдкреНрд░рдЧрддрд┐ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдХрд╛рд░реНрдп рдХреНрд░рдо
рдХрд╛рд░реНрдп рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдЕрдХреНрд╕рд░ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ:
- рдЕрдиреБрдХреНрд░рдорд┐рдХ рдирд┐рд░реНрднрд░ рдХрд╛рд░реНрдп;
- рд▓рдЧрд╛рддрд╛рд░ рд╕реНрд╡рддрдВрддреНрд░ рдХрд╛рд░реНрдп;
- рд╕рдорд╛рдирд╛рдВрддрд░ рд╕реНрд╡рддрдВрддреНрд░ рдХрд╛рд░реНрдпред
рдХреНрд░рдорд┐рдХ рдирд┐рд░реНрднрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдКрдкрд░ рдорд╛рдирд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВ рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╡рд░рдг рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рджреВрдВрдЧрд╛ред
рдкрд╣рд▓реА рдЕрд╕рдлрд▓рддрд╛ рдкрд░ рдХрд╛рд░реНрдп рдЕрдиреБрдХреНрд░рдо рдмрд╛рдзрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреА рд╣реИред рд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░, рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдХреБрдЫ рд╕рдВрдпреЛрдЬрди рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
someTaskA |> Task.andThen (\resultA -> someTaskB |> Task.map (\resultB -> (resultA, resultB) ) )
рдпрд╣ рдХреЛрдб рдЯрд╛рд╕реНрдХ рдПрд░рд░ (a, b) рдЯрд╛рдЗрдк рдХрд╛ рдХрд╛рд░реНрдп рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЯрд╛рд╕реНрдХ.рдЯрдВрдбреЗрди рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЛ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рдлрд▓ рд╕рдорд╛рдкрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдирдП рдХрд╛рд░реНрдп рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЯрд╛рд╕реНрдХ.рдореИрдк рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЛ рд╕рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рддрд░рдмреВрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдРрд╕реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬрдм рдХрд╛рд░реНрдп рдХрд╛ рд╕рдлрд▓ рд╕рдорд╛рдкрди рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдбреЗрдЯрд╛ рдХреА рд╕реНрдерд┐рд░рддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рдорд╛рди рд▓реЗрдВ:
someTaskA |> Task.andThen (\resultA -> someTaskB |> Task.andThen (\resultB -> case resultA.userId == resultB.userId of True -> Task.succeed (resultA, resultB) False -> Task.fail тАЬUser is not the sameтАЭ ) )
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЯрд╛рд╕реНрдХ.рдореИрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп, рдЯрд╛рд╕реНрдХ.рдПрдВрдбрдЯреИрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЗ рдХрд╛рд░реНрдп рдХреА рд╕рдлрд▓рддрд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ Task.succeed рдФрд░ Task.fail рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред
рдпрджрд┐ рдХреЛрдИ рдПрдХ рдХрд╛рд░реНрдп рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рддреЛ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдорд╛рди рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рд╕реНрдХ.рдСрдирдЖрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
someTaskA |> Task.onError (\msg -> Task,succeed defaultValue) |> Task.andThen (\resultA -> someTaskB |> Task.map (\resultB -> (resultA, resultB) ) )
рдЯрд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ред рдХрд╛рд░реНрдп рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдХрд╛рд░реНрдп рдХреЛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЯрд╛рд╕реНрдХ.рдореИрдкрдПрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдЧрд╛рддрд╛рд░ рд╕реНрд╡рддрдВрддреНрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреЛ рдЖрдкрдХреЛ рдХрдИ рдХрд╛рд░реНрдп рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рдорд┐рд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдЧрд┐рд░ рдЧрдпрд╛ рдХрд╛рд░реНрдп рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд╛рд╕реНрдХ.рдСрдирдЖрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЯрд╛рд╕реНрдХ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рджреЗрдЦреЗрдВ ред рдпрд╣ рдЖрдкрдХреЛ рд╕рдорд╛рди рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╡рд░реНрддрдорд╛рди рднрд╛рд╖рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрдирдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдкрдбреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЗрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╡реЗрджрди рдпрд╛ рдШрдЯрдХ рд╕реНрддрд░ рдкрд░ рд╕рдВрднрд╡ рд╣реИред рд╕рднреА рддрд░реНрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдХрдВрдзреЛрдВ рдкрд░ рдмрдиреЗ рд╣реБрдП рд╣реИрдВред