如何等待随后链上的第一个到达结果?

时间:2018-10-13 13:35:27

标签: task elm elm-architecture

我们可以使用Promise.race等待thenable链上的第一个到达结果。 Task模块似乎尚不支持它,Task.sequence仅等效于Promise.all

不可修改的解决方案演示:

import Process
import Task


init () =
    ( Nothing, Cmd.batch [ after 2 "2nd", after 1 "1st" ] )


after seconds name =
    Process.sleep (1000 * seconds)
        |> Task.map (always name)
        |> Task.perform Done


type Msg
    = Done String


update (Done name) model =
    case model of
        Nothing ->
            ( Debug.log name <| Just name, Cmd.none )

        _ ->
            ( Debug.log name model, Cmd.none )


main =  
    Platform.worker
        { init = init
        , update = update
        , subscriptions = always Sub.none
        }

运行它,按预期输出:

1st: Just "1st"
2nd: Just "1st"

1 个答案:

答案 0 :(得分:4)

Stream作为独立功能,需要维护局部状态以跟踪是否已解决该问题,您可能知道这在Elm中是不可能的。

但是通过自己跟踪模型中的状态,您可以相对轻松地完成相同的事情。这是一个使用Promise.race来跟踪我们是否收到响应的示例:

Maybe