- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我当时使用Bluebird进行异步处理,但现在必须进行大量的空/空/错误检查,如果不想使用其他路由,我也不想这么做。我想使用monad,但尚未完全了解它。
我也希望它能与ramda的pipe / compose
一起很好地播放,因为我的大多数其他代码都整齐地封装在功能管道中。根据many discussions的说法,与Promises相比,首选Monadic Futures(似乎建议使用Fluture),并且在将来的版本中可能会删除对pipeP和composeP的支持。
Fluture似乎是一个不错的选择,因为它可以与遵循fantasy-land specs的库(如ramda)一起很好地运行。
但是,我完全迷失了如何实现将Ramda的管道与Fluture集成在一起的东西。我需要一些示例代码的帮助。
例如:
我有一个数据库调用,返回一个对象数组。该数组可以具有值,为空或未定义。我有一个功能管道,可以转换数据并将其返回到前端。
示例 promise 代码:
fancyDBCall1(constraints)
.then(data => {
if (!data || data.length === 0) {
return []
}
return pipe(
...
transformation functions
...
)(data)
})
.then(res.ok)
.catch(res.serverError)
最佳答案
你能做什么 ?
因此,什么时候可以使用您的代码。但首先,让我们谈谈Monads。
在此代码中,可以使用3种类型的Monad:
nothing
)fancyDBCall1(constraints)
返回
Maybe
。这意味着它可能返回结果,或者什么都不返回。
fancyDBCall1
是异步操作。这意味着它必须返回
Future
。这里的窍门不是让它返回值的 future ,例如
Future <Array>
使其返回
Future < Maybe Array >
。
Future.of('world');
Future.of( Maybe( 'world' ) );
if (!data || data.length === 0) {
return []
}
/*
* Accepts <Maybe Array>.
* Most ramda.js functions are FL compatible, so this function
* would probably remain unchanged.
**/
const tranform = pipe( .... );
// fancyDBCall1 returns `Future <Maybe Array>`
fancyDBCall1(constraints)
.map( transform )
.fork( always(res.serverError), always(res.ok) );
transform
崩溃了怎么办?好吧,您将说“我们发送res.serverError”。
transform
函数由于用户名无效而失败,该怎么办?
transform
函数:
/*
* Accepts <Maybe Array>.
* Returns <Maybe <Either String, Array> >
**/
const tranform = pipe( .... );
Future <Maybe Array>
:
const { Future } = require("fluture");
const S = require("sanctuary");
const transform = S.map(
S.pipe( [ S.trim, S.toUpper ] )
);
const queryResult = Future.of(
S.Just( [" heello", " world!"] )
);
//const queryResult2 = Future.of( S.Nothing );
const execute =
queryResult
.map( S.map( transform ) )
.fork(
console.error,
res => console.log( S.fromMaybe( [] ) ( res ) )
);
queryResult
和
queryResult2
。这应该使您对Maybe monad可以做什么有所了解。
const validateGreet = array =>
array.includes("HELLO") ?
S.Right( array ) :
S.Left( "Invalid Greeting!" );
// Receives an array, and returns Either <String, Array>
const transform = S.pipe( [
S.map( S.pipe( [ S.trim, S.toUpper ] ) ),
validateGreet
] );
Future <Maybe <Either <String, Array>>>
。
const { Future } = require("fluture");
const S = require("sanctuary");
const validateGreet = array =>
array.includes("HELLO") ?
S.Right( array ) :
S.Left( "Invalid Greeting!" );
// Receives an array, and returns Either <String, Array>
const transform = S.pipe( [
S.map( S.pipe( [ S.trim, S.toUpper ] ) ),
validateGreet
] );
//Play with me!
const queryResult = Future.of(
S.Just( [" heello", " world!"] )
);
//Play with me!
//const queryResult = Future.of( S.Nothing );
const execute =
queryResult
.map( S.map( transform ) )
.fork(
err => {
console.error(`The end is near!: ${err}`);
process.exit(1);
},
res => {
// fromMaybe: https://sanctuary.js.org/#fromMaybe
const maybeResult = S.fromMaybe( S.Right([]) ) (res);
//https://sanctuary.js.org/#either
S.either( console.error ) ( console.log ) ( maybeResult )
}
);
The end is near!: ${err}
,然后干净地退出该应用程序。
[]
。
"Invalid Greeting!"
。
关于javascript - 将Fluture与Ramda一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44879042/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭去年。 Improve th
我正在尝试向嵌套对象添加新属性 width 和 height。 我的数据结构是这样的: const graph = { id: 'root', children: [ {
我正在尝试向嵌套对象添加新属性 width 和 height。 我的数据结构是这样的: const graph = { id: 'root', children: [ {
我想像这样计算三个数组。 const Data = { x : [2,4,6], y : [10,10,10], z : [5,5,5] } const XtimesYplusZ
转换以下对象的最简单方法是什么? // original { name: "bob", age: 24 } // result { name: "bob", age: 24, de
这是初始状态。 const All = { id : [ "a", "b", "c", "d", "e"], count : [1, 2, 2], } 我想把 All.id 拆分成 [ ["a
let arr = [ { name: 'Anna', q: { name: 'Jane' } } ]; const getName = R.prop('n
我有下面的代码,我想在其中填写id,所以我想写这样的东西: const data = [ { id: 'some-id' }, { id: 'some-other-id' }, { id: 't
我有一个类似这样的列表: var list = [ { stack: [ { file: 'abc' } ] }, { st
鉴于下面的功能,如何将其转换为无点样式?使用 Ramda 的 prop 会很好和 path并跳过数据参数,但我无法弄清楚正确的语法。 const mapToOtherFormat = (data) =
Ramda 适合懒人 Ramda 的 transduce启用 creation of lazy sequences . 一对多 R.chain可以在转换器中用作一对多运算符,如下所示 ( REPL )
Ramda 是否具有从列表中删除错误值的功能? 我知道我们可以简单地做 var compact = R.filter(R.identity);但我错过了现成的功能吗? 最佳答案 没有直接的等价物,但
我是 的新手 lambda 我正在努力实现以下目标: 我有一组对象(即消息)。 我想按对方 ID 对消息进行分组(发件人或收件人 ID,不是 1,请参阅下面的 groupBy lambda)。 我将获
我正在探索这两个库,对我来说 ImmutableJS具有(主要)不可变的数据结构,而 Ramda有瑞士军刀套装FP实用程序。 当我谷歌时,我看到类似 Ramda 的文章对比 ImmutableJS推荐
试图弄清楚 IO monad 是如何工作的。 使用下面的代码,我读取了 filenames.txt 并使用结果重命名目录 testfiles 中的文件。这显然是未完成的,所以我没有实际重命名我登录到控
我是 ramdajs 的新手。假设我有一个对象: {a: 1, b: 2, c: 3} 我可以这样做来将 a 更改为 11: const aLens = R.lensProp('a'); R.
我想从对象中删除所有空值。让我们假设: const data = { key1: 'ok', key2: null, key3: '', // should be removed too
我有两个柯里化(Currying)函数 f 和 g: f: a -> b -> c g: a -> c -> d 我想创建h: h: a -> b -> d 目前我正在通过 pipe 编写它们: co
我很想学习 js 中的函数式编程,但是我遇到了困难。我觉得我一直在做这样的事情,这感觉根本不对: export const getParamFromUrl = R.curry((name, url)
我试图将一个函数传递到一个过滤器中,该过滤器本身嵌套在更深的函数中 从概念上讲,类似于这个(损坏的)示例: const testData = [ {foo: "foo", bar: ""} ];
我是一名优秀的程序员,十分优秀!