此处介绍了面向铁路的编程(ROP):
https://fsharpforfunandprofit.com/rop/
是否可以通过Fluture
我可以使用以下两种辅助方法进行ROP:
const bind = f => x => Future.attempt(() => f(x));
const bindAsync = f => x => Future.tryP(() => f(x));
Future.of("TEST")
.chain(bind(doThis))
.chain(bind(doThat))
.chain(bindAsync(doThisAsync))
.chain(bindAsync(doThatAsync))
.chain(bind(doAnotherThing))
.chain(bindAsync(doAnotherThingAsync))
.
.
.
是否有更好的方法来删除bind
,bindAsync
并自动进行绑定?
答案 0 :(得分:1)
我不建议像这样构造您的程序。看起来您有一些引发异常并使用promise(这是您希望通过使用ROP摆脱的两件事)的函数,它们分散在整个程序中,然后在顶层进行组合。
相反,您应该包装正在使用的库,以便摆脱promise / exception,并将它们转换为尽可能接近问题库的future。例如。如果您使用诺言进行HTTP网络调用,请包装网络库,以便它返回期货。
这意味着您可以随后将合成功能更改为可以使用map
和chain
直接组成的纯函数和Future-returning函数。