PureScript FFI和Aff Monad:为什么效果永远不会运行?

Nic*_*ers 2 monads purescript

我是一个纯粹的PureScript新手,需要一些帮助来弄清楚为什么用Aff monad模拟的FFI功能似乎对我不起作用.

预期的行为是在1000ms后将消息"keyMessage"记录到控制台.

相反,程序只是在以下输出后无限期挂起:

Compiling Main
* Build successful.
Waiting for message...
Run Code Online (Sandbox Code Playgroud)

Main.purs:

module Main where

import Prelude
import Control.Monad.Aff (Aff, Fiber, launchAff)
import Control.Monad.Aff.Console (log)
import Control.Monad.Eff (Eff, kind Effect)
import Control.Monad.Eff.Console (CONSOLE)

main :: forall e. Eff (console :: CONSOLE, to :: TIMEOUT | e) (Fiber (console :: CONSOLE, to :: TIMEOUT | e) Unit)
main = launchAff do
  log "Waiting for message..."
  m <- message "key"
  log m

foreign import data TIMEOUT :: Effect

foreign import message :: forall e. String -> Aff (to :: TIMEOUT | e) String
Run Code Online (Sandbox Code Playgroud)

Main.js:

'use strict';

exports.message = function(key) {
  return function(errback, callback) {
    var timeout = setTimeout(function() {
      callback(key + 'Message');
    }, 1000);

    return function() {
      return function (cancelErrback, cancelCallback) {
        clearTimeout(timeout);
        return cancelCallback();
      };
    };
  };
};
Run Code Online (Sandbox Code Playgroud)

提前感谢您的见解!

gb.*_*gb. 5

如果您正在使用purescript-aff(v4或更高版本)的最新主要版本,则运行时表示Aff已更改,并且您无法再使用errback/callback函数样式直接创建它.

看一下https://pursuit.purescript.org/packages/purescript-aff/4.0.2/docs/Control.Monad.Aff.Compat模块,特别是EffFnAff类型/ fromEffFnAff函数,以解释相同的事情现在有效.

或者你也可以构造Affs makeAff,但这需要重新配置你的FFI代码.