Fluture: как обращаться с нулевой обработкой с помощью монад

Я новичок в функциональном программировании и нашел следующий пример функционального программирования fluture, который, кажется, дает действительно хороший пример обработки запросов к базе данных и последующего манипулирования данными. Однако предостережение заключается в том, что при чтении концепций функционального программирования монады Just / Nothing казались рекомендуемым подходом для обработки нулевой проверки. 1) Как это вписывается в этот пример и 2) если findOne отвергнет, остановит ли это выполнение последующих цепочек и немедленно перейдет к вилке?

      import Future from 'fluture';

const processAll = Future.fork(_sendError, _sendResponse);

const _fetchFromDB =
    encaseP(userId => myModel.findOne({ id: userId }).exec())
  //Future.fromPromise(userId => myModel.findOne({ id: userId }).exec())

processAll(_fetchFromDB(userId)
  .chain(getDataGeneric)
  .chain(_findDevice)
  .chain(_processRequest))

Я получил этот пример из следующей ссылки stackoverflow и изменил fromPromise на encaseP:

Как заставить Either Monads знать об асинхронных функциях (Promises / Future)

Я предполагаю, что encaseP заменит fromPromise в их примере при преобразовании обещания в будущее.

1 ответ

Решение

На самом деле, Maybe (Nothing | Just) часто не то, что вам нужно для обработки ошибок, потому что, хотя он может помочь вам сократить последующие операции и дать вам возможность предоставить значение по умолчанию, он не скажет вам, почему вычисление может не завершено.

Either (Left | Right) дает вам те же функции, но также позволяет вам получить доступ к контексту, который заставил ваш поток принять ветвь ошибки, потому что Left также содержит данные, такие как сообщение об ошибке, которое полезно для восстановления после ошибок, ведения журнала или отображения полезных сообщений для пользователя.

Fluture предлагает асинхронный вариант Either. Поскольку это асинхронно, вы не можете получить значение напрямую (как вы привыкли с Promises), но в остальном оно ведет себя так же, как Maybe / Either: fork эквивалентен fold. Вы получите короткое замыкание и многое другое (например, смена трека, отображение на отклоненной ветви и т. Д.).

Здесь есть хорошее введение https://dev.to/avaq/fluture-a-functional-alternative-to-promises-21b

Другие вопросы по тегам