PureScript FFI & Aff Monad:为什么效果从不 运行?
PureScript FFI & Aff Monad: Why does the effect never run?
我是一个完全的 PureScript 新手,需要一些帮助来弄清楚为什么使用 Aff monad 建模的 FFI 函数似乎对我不起作用。
预期的行为是在 1000 毫秒后将消息 "keyMessage" 记录到控制台。
相反,程序在以下输出后无限期挂起:
Compiling Main
* Build successful.
Waiting for message...
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
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();
};
};
};
};
提前感谢您的见解!
如果您使用的是 purescript-aff
的最新主要版本(v4 或更高版本),则 Aff
的运行时表示已更改,您无法使用 errback/callback函数风格了。
查看 https://pursuit.purescript.org/packages/purescript-aff/4.0.2/docs/Control.Monad.Aff.Compat 模块,特别是 EffFnAff
类型/fromEffFnAff
函数,了解等效功能现在是如何工作的。
或者,您也可以使用 makeAff
构建 Aff
s,但这需要稍微重新制定您的 FFI 代码。
我是一个完全的 PureScript 新手,需要一些帮助来弄清楚为什么使用 Aff monad 建模的 FFI 函数似乎对我不起作用。
预期的行为是在 1000 毫秒后将消息 "keyMessage" 记录到控制台。
相反,程序在以下输出后无限期挂起:
Compiling Main
* Build successful.
Waiting for message...
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
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();
};
};
};
};
提前感谢您的见解!
如果您使用的是 purescript-aff
的最新主要版本(v4 或更高版本),则 Aff
的运行时表示已更改,您无法使用 errback/callback函数风格了。
查看 https://pursuit.purescript.org/packages/purescript-aff/4.0.2/docs/Control.Monad.Aff.Compat 模块,特别是 EffFnAff
类型/fromEffFnAff
函数,了解等效功能现在是如何工作的。
或者,您也可以使用 makeAff
构建 Aff
s,但这需要稍微重新制定您的 FFI 代码。