Как использовать setTimeout в PureScript v0.7
Я хочу использовать setTimeout для анимации в PureScript, как это.
loop n =
if n > 100
then do
return Unit
else do
print n
timeout (loop n+1) 30
Purescript-таймеры больше не работают в v0.7.
У меня нет ни малейшего представления, как это реализовать.
2 ответа
Решение
Есть два способа:
Используйте purescript-js-timers из purescript-contrib.
Используйте purescript-aff (
later'
).
Я предпочитаю позже, и вот пример:
import Control.Monad.Aff as Aff
update :: forall eff. Action -> State -> EffModel State Action (eff)
update MyAction myState =
{ state: myState, effects: [ Aff.later' 1000 $ pure MyOtherAction ] }
Самый простой способ - определить собственный импорт для setTimeout
:
module SetTimeout where
foreign import data TIMEOUT :: !
foreign import timeout :: forall eff a.
Int ->
Eff (timeout :: TIMEOUT | eff) a ->
Eff (timeout :: TIMEOUT | eff) Unit
В вашем внешнем модуле Javascript вы можете определить setTimeout
следующее:
"use strict";
// module SetTimeout
exports.timeout = function(millis) {
return function(action) {
return function() {
setTimeout(action, millis);
};
};
};
Вы сможете расширить это для работы с такими вещами, как clearTimeout
если нужно.
Некоторые другие возможные подходы:
- Отправить запрос на обновление для обновления
purescript-timers
следуя руководству по миграции в вики: https://github.com/purescript/purescript/wiki/0.7-Migration-Guide - использование
later'
отpurescript-aff
: doc