回调完成后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