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:

Как сделать Монады должны знать об асинхронных функциях (Promises/Future)

Я предполагаю, что encaseP заменит fromPromise в своем примере при преобразовании Promise в Future.


person user1790300    schedule 05.03.2021    source источник


Ответы (1)


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

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

Fluture дает вам асинхронный файл Does. Поскольку это асинхронно, вы не можете получить значение напрямую (как вы привыкли к обещаниям), но, кроме этого, оно ведет себя так же, как «Может быть/Или: fork эквивалентно fold». Вы получите короткое замыкание и многое другое (например, изменение дорожки, сопоставление отвергнутой ветки и т. д.).

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

person geoffrey    schedule 05.03.2021
comment
Итак, «Либо» дает вам возможность использовать ожидание/асинхронность в конвейере? - person user1790300; 07.03.2021
comment
Вы можете использовать вспомогательную функцию promise вместо fork, если вы хотите запустить вычисление Future как обещание и иметь возможность await его, но тогда вы потеряете возможность отменить его, и исключения будут смешаны с ветвью отклонения, поэтому лучше всего попрактикуйтесь в максимально возможном использовании многих функций железнодорожного программирования Fluture и, возможно, запустите вычисление как Promise на самом краю вашей программы, если вам нужно. В любом случае вы не можете вкладывать промисы и фьючерсы, потому что промисы нетерпеливы, а фьючерсы ленивы: когда вы работаете с Fluture, все, что вы пишете, является принятием желаемого за действительное, пока вы не разветвитесь. - person geoffrey; 07.03.2021