Использовать запрос affjax http в контексте ExceptT - PullRequest
0 голосов
/ 12 ноября 2018

большинство функций ввода-вывода в моей программе приводят к этому типу:

ExceptT Err (Eff eff) a

это хорошо работает для меня, и это вполне сочетаемо. Однако теперь у меня есть некоторые проблемы, связанные с интеграцией вызова AJAX в одну функцию.

Мне не нужно асинхронное поведение, однако мне показалось, что Affjax - самая распространенная библиотека для этого. Скажем, теперь я хотел бы, чтобы результат был String, тогда я в основном ищу функцию с такой подписью:

getData :: forall eff. ExceptT Err (Eff (ajax :: AJAX | eff)) String

Вот как далеко я продвинулся, однако он остается в контексте Aff:

getData :: forall eff.
  ExceptT
    Error
    (Aff ( ajax :: AJAX | eff ))
    String
getData =
  Ajax.get "the/url" # attempt # wrap # map _.response

Но как мне написать это, чтобы оно хорошо сочеталось с контекстом Eff?

1 Ответ

0 голосов
/ 13 ноября 2018

ИНФОРМАЦИЯ: Я отвечаю на этот вопрос в контексте PureScript 0.12, хотя в этом вопросе используется подход до 0.12 Eff.

В основном я ищу функцию с этой сигнатурой:

getData :: forall eff. ExceptT Err (Eff (ajax :: AJAX | eff)) String

В настоящее время purescript-affjax вызывает XMLHttpRequest.open в асинхронном режиме, поскольку во втором аргументе используется значение true (подробнее XMLHttpRequest Сведения об API здесь ).

Невозможно легко заменить «драйвер xhr», который запускается affjax в текущей версии этой библиотеки, но продолжается обсуждение о создании этогоконфигурируемый кусокЕсли вы действительно хотите выполнить синхронный вызов ajax, вы, вероятно, должны написать для него свой собственный FFI или ... внести свой вклад в библиотеку: -)

Но как мне это написать, чтобы он хорошо сочетался с контекстом Eff?

В общем, нет способа превратить Aff в вычисление Effect.Это имеет смысл, если вы думаете о Effect как об абстракции, которая моделирует последовательность инструкций без понятия «будущее» или «время».Мы просто не можем «вернуть» будущее значение прямо сейчас ...

Конечно, есть liftEffect, который может превратить синхронные вычисления в Aff, потому что мы всегда можем взять синхронные вычисления и просто запустить их вбудущее.

Я думаю, что при использовании по умолчанию javascript PureScript backend вполне обычно превращать все приложение в Aff и использовать launchAff_ в функции main.

...