在回调完成后,Aff会继续尝试致电成功

时间:2016-08-06 01:34:20

标签: purescript

我是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的控制台输出。

感谢您的帮助。

1 个答案:

答案 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