Skip to content

Task requests and tracking progress #61

Open

Description

@Janiczek

Is there a reason Task requests don't accept the tracker field to track progress?

https://package.elm-lang.org/packages/elm/http/latest/Http#task
compare to
https://package.elm-lang.org/packages/elm/http/latest/Http#request

Activity

  1. lydell commented on Nov 1, 2019

    @lydell

    Here’s a use case.

    I made a function that first asks my API for an AWS S3 signed URL, and then uploads a file to that signed URL (using Task.andThen). Now I wanted to show the upload progress, but learned that Http.task does not take a tracker. It felt nice having a function that let me upload a file without having to think about the presigned URL, but now I have to break it up into two steps and use Http.request instead.

  2. toastal commented on Jan 6, 2020

    @toastal

    Use case 2:

    I wanted a waitAtLeast function for my form submissions because sometimes that request would react before the user knew, additionally sometimes I raise a toast on the screen and don't want it to popup and disappear too quickly if the request is fast. If Cmd/Tasks were like Futures, I'd run a timer and the request in parallel and await both the results (ditching the timer) Parallelism isn't really supported in that sort of way. To get around that, I've used Task.andThen like:

    waitAtLeast : Int -> Task x a -> Task x a
    waitAtLeast delay task =
        -- Sure would be nice to have do notation here
        -- do
        --   start <- Time.now
        --   value <- task
        --   end <- Time.now
        --   let toWait = end - start - delay
        -- . . .
        -- desugared into:
        Time.now
            |> Task.andThen
                (\start ->
                    task
                        |> Task.andThen
                            (\value ->
                                Time.now
                                    |> Task.andThen
                                        (\end ->
                                            let
                                                toWait : Int
                                                toWait =
                                                    delay
                                                        - Time.posixToMillis end
                                                        + Time.posixToMillis start
                                            in
                                            if toWait <= 0 then
                                                Task.succeed value
    
                                            else
                                                Process.sleep (toFloat toWait)
                                                    |> Task.andThen (\_ -> Task.succeed value)
                                        )
                            )
                )

    Turning a Http.Request into a Task, I get the waitAtLeast part I wanted, but now that it's a Task I have no access to the tracker.

  3. jjant commented on Sep 29, 2021

    @jjant
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions