2017-02-23 130 views
0

Я играл с purescript и сигналами. У меня есть блок кодаrunSignal работает в браузере, но не на консоли узла

runSignal $ (every 2000.0) ~> logShow 

, которые при компиляции в JS файл (мякоть browserify) в

main = do 
     runSignal $ (every 2000.0) ~> logShow 

и выполняются в браузере, работает, как ожидалось (журналы что-то каждые 2 секунды), но застрял на консоли psci. Почему это поведение? Любая помощь будет оценена по достоинству.

ответ

0

PSCi имеет два режима:

  • Он может использовать узел для выполнения скомпилированного JS (режим по умолчанию). В этом режиме он запускает новый процесс узла для каждого выражения и печатает результат синхронно в консоли.
  • Он может использовать веб-браузер для выполнения (с использованием опции --port) через websocket. В этом режиме он отправляет фрагмент JS в длительный процесс браузера.

В первом режиме, runSignal не собирается делать что-либо интересное, так как он будет запустить таймер и немедленно вернуться, но вы, вероятно, может получить что-то работает легко, используя второй режим.

+0

Thanks Phil. Но следующий запуск psci даже не отображается при запуске этой строки. Он застрял, и я должен сделать^C, чтобы прервать его. Является ли это результатом синхронного запуска процесса узла, который продолжает ждать результата этого выражения? –

+0

Да, это так. –

0

Я видел подобное поведение с бесконечными процессами в psci. Простой пример был бы ...

module NeverEnding where 

import Prelude 
import Control.Monad.Eff.Console (log) 
import Control.Monad.Rec.Class (forever) 

main = forever $ do 
    log "log" 

Если вы загрузите этот модуль в psci и запустить main, вы не увидите никаких выходных данных. С точки зрения рабочего процесса, если вы хотите проверить что-то подобное с консоли, я предлагаю запустить pulp --watch run --main NeverEnding. --main установит модуль, который вы хотите в качестве главной точки входа. --watch будет следить за изменениями файлов, а также при изменении, убить нескончаемый процесс, перекомпилировать и перезапустить.