purescript-contrib/purescript-aff

FFI Requires setTimeout

BebeSparkelSparkel opened this issue · 4 comments

When using FFI for Aff I need to use setTimeout before calling onSuccess or else the page hangs as if onSuccess was never called. Feels like there is some listener setup in the wrong order or onSuccess is defined after the return.

Failing example without timeout.

exports.failing = s => (onError, onSuccess) => {
  onSuccess(s)
  return (cancelError, cancelerError, cancelerSuccess) => {cancelerSuccess()}
}

Working example with timeout.

exports.working = s => (onError, onSuccess) => {
  setTimeout(() => onSuccess(s), 100)
  return (cancelError, cancelerError, cancelerSuccess) => {cancelerSuccess()}
}

I cannot reproduce this with a modified version of the EffectFn test that always resolves immediately. I suspect that you have some sort of race condition in your code. Could you post a self contained example?

This is because you are typing it as Aff. Aff's representation is opaque. You need to type it as EffectFnAff and use the Compat module.

-- | foreign import _myAff :: EffectFnAff String
-- |
-- | myAff :: Aff String
-- | myAff = fromEffectFnAff _myAff

Sorry about that. Just fixed it and am still having the same problem