Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Task requests and tracking progress #61

Open
Janiczek opened this issue May 21, 2019 · 4 comments
Open

Task requests and tracking progress #61

Janiczek opened this issue May 21, 2019 · 4 comments

Comments

@Janiczek
Copy link

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

@jaredramirez
Copy link

@lydell
Copy link

lydell commented Nov 1, 2019

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.

@toastal
Copy link

toastal commented Jan 6, 2020

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.

@jjant
Copy link

jjant commented Sep 29, 2021

@evancz ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants