回调完成后Aff一直尝试调用成功
Aff keeps trying to call success after callback is complete
我对 purescript 还很陌生,我有一个简单的 purescript 演示应用程序 运行 on AWS Lambda。我试图让它与 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)();
}
}
};
在pulp生成的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
}
}
}
这发生在 cb(v)();
在 Test.js 中完成后,因为我可以在 lambda 日志中看到 js 和 purs 的控制台输出。
感谢您的帮助。
来自https://github.com/slamdata/purescript-aff/issues/54
... you can't use an Aff value directly as a main, you need to runAff or launchAff it to turn it into an Eff:
main = launchAff do
a <- later $ pure 42
b <- later' 1000 $ pure 58
pure $ a + b
我对 purescript 还很陌生,我有一个简单的 purescript 演示应用程序 运行 on AWS Lambda。我试图让它与 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)();
}
}
};
在pulp生成的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
}
}
}
这发生在 cb(v)();
在 Test.js 中完成后,因为我可以在 lambda 日志中看到 js 和 purs 的控制台输出。
感谢您的帮助。
来自https://github.com/slamdata/purescript-aff/issues/54
... you can't use an Aff value directly as a main, you need to runAff or launchAff it to turn it into an Eff:
main = launchAff do
a <- later $ pure 42
b <- later' 1000 $ pure 58
pure $ a + b