如何在 PureScript v0.7 中使用 setTimeout

How to use setTimeout in PureScript v0.7

我想像这样在 PureScript 中为动画使用 setTimeout。

loop n =
  if n > 100
  then do
    return Unit
  else do
    print n
    timeout (loop n+1) 30

purescript-timers 在 v0.7 中不再有效。

我完全不知道如何实现它。

最简单的方法是为 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 之类的东西。

其他一些可能的方法:

有两种方法:

  1. 使用 purescript-contrib 中的 purescript-js-timers

  2. 使用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 ] }