segun respuestas respuesta qué quien que primero huevo gallina fue cientifica chiste biblia elm

elm - respuestas - quien fue primero el huevo o la gallina segun la biblia



Cómo lograr el comportamiento de setTimeout en Elm. (3)

Algo que puede no ser obvio al principio es el hecho de que las suscripciones pueden cambiar según el modelo. Ellos son evaluados efectivamente después de cada actualización. Puede usar este hecho, junto con algunos campos en su modelo, para controlar qué suscripciones están activas en cualquier momento.

Aquí hay un ejemplo que permite un intervalo de parpadeo del cursor variable :

subscriptions : Model -> Sub Msg subscriptions model = if model.showCursor then Time.every model.cursorBlinkInterval (always ToggleCursor) else Sub.none

Si entiendo sus preocupaciones, esto debería superar el potencial para manejar garrapatas innecesarias. Puede tener múltiples suscripciones de diferentes intervalos utilizando Sub.batch .

Estoy escribiendo un juego web en Elm con muchos eventos que dependen del tiempo y estoy buscando una manera de programar un evento en un tiempo específico.

En JavaScript utilicé setTimeout(f, timeout) , que obviamente funcionó muy bien, pero, por varias razones, quiero evitar el código JavaScript y usar Elm solo.

Soy consciente de que puedo subscribe a Tick a intervalos específicos y recibir tics de reloj, pero esto no es lo que quiero; mis retrasos no tienen un denominador común razonable (por ejemplo, dos de los retrasos son 30ms y 500ms), y quiero para evitar tener que manejar un montón de garrapatas innecesarias.

También encontré la Task y el Process . Parece que al usarlos, de alguna manera puedo hacer lo que quiero con la Task.perform failHandler successHandler (Process.sleep Time.second) .

Esto funciona, pero no es muy intuitivo: mis manejadores simplemente ignoran todas las entradas posibles y envían el mismo mensaje. Además, no espero que el tiempo de espera falle nunca, por lo que crear el controlador de fallas es como alimentar a la biblioteca, que no es lo que esperaría de un lenguaje tan elegante.

¿Hay algo como el Task.delayMessage time message que haría exactamente lo que necesito (enviarme una copia de su argumento del mensaje después del tiempo especificado), o tengo que hacer mi propia envoltura?


Si desea que algo suceda "cada x segundos", entonces lo que necesita es una solución similar a una suscripción, tal como lo describe @ChadGilbert. (que es más o menos como setInterval() javascript.

Si, por otro lado, desea que algo suceda solo "una vez, después de x segundos", entonces la ruta Process.sleep es el camino a seguir. Esto es el equivalente de setTimeOut() de javascript: después de un tiempo, hace algo una vez.

Probablemente tengas que hacer tu propia envoltura para ello. Algo como

-- for Elm 0.18 delay : Time -> msg -> Cmd msg delay time msg = Process.sleep time |> Task.andThen (always <| Task.succeed msg) |> Task.perform identity

Para usar, por ejemplo, de esta manera:

--- update msg model = case msg of NewStuff somethingNew -> ... Defer somethingNew -> model ! [ delay (Time.second * 5) <| NewStuff somethingNew ]


Una versión actualizada y simplificada de la respuesta de @wintvelt es ahora:

delay : Time.Time -> msg -> Cmd msg delay time msg = Process.sleep time |> Task.perform (/_ -> msg)

con el mismo uso