我是purescript的新手,我有一个在AWS Lambda上运行的简单的purescript演示应用程序。我试图让它与S3交谈,这实际上是成功的,但是当Aff回调完成执行时,_makeAff javascript函数试图再次调用其内部success
回调。该调用失败,因为success
在此时为undefined
,因此它抛出,命中catch块,当它尝试调用error
时,它再次抛出,程序终止。
这是一个简单的例子来展示我如何设置:
Main.purs
-- I've tried
myTest "hello world!" >>= (\s -> log $ "from purs " <> s)
-- and
do
res <- myTest "hello world!"
log $ "from purs " <> res
Test.purs
module Lib.Test
(myTest)
where
import Control.Monad.Aff (Aff, makeAff, runAff)
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Exception (EXCEPTION, throwException, error, message, try)
import Control.Monad.Aff.Console (log)
import Prelude
foreign import myTestEff :: forall e . (String -> Eff e Unit) -> String -> Eff e Unit
myTest :: forall e . String -> Aff e String
myTest s = makeAff \reject resolve -> myTestEff resolve s
Test.js
"use strict";
// module Lib.Test
exports.myTestEff = function (cb) {
return function (s) {
return function () {
console.log("from js " , s);
cb(s)();
}
}
};
在纸浆制作的已编译的index.js文件中,错误发生在_makeAff
函数中:
exports._makeAff = function (cb) {
return function(success, error) {
try {
return cb(function(e) {
return function() {
error(e);
};
})(function(v) {
return function() {
success(v); // i fail
};
})();
} catch (err) {
error(err); // then i fail
}
}
}
并且在Test.js中cb(v)();
完成后会发生这种情况,因为我可以在lambda日志中看到来自js和purs的控制台输出。
感谢您的帮助。
答案 0 :(得分:1)
来自https://github.com/slamdata/purescript-aff/issues/54
...你不能直接使用Aff值作为主要内容,你需要runAff或launchAff它将它变成Eff:
main = launchAff do
a <- later $ pure 42
b <- later' 1000 $ pure 58
pure $ a + b