gos*_*eti 1 javascript functional-programming ramda.js
我目前有一个user对象,它有一个currentRoom()方法,有时可能不存在或返回null.
如果currentRoom()方法返回一些东西,那么我需要调用一个messages()方法.如果从任何一个都没有返回任何内容,我想返回一个默认的空数组[].
我想使用Ramda在功能上解决这个问题,所以它很整洁且可重复使用.目前,我的(非Ramda)代码如下所示:
const user = Users.findOne({ username: params.id })
const room = (user.currentRoom && user.currentRoom() || {})
const messages = (room.messages && room.messages() || [])
Run Code Online (Sandbox Code Playgroud)
我想的某种逻辑是传递所需方法的列表,以及默认结果,如果没有任何结果.
/* getMessages(defaultIfNull, methodsArray, object) */
getMessages([], ['currentRoom', 'messages'], user)
Run Code Online (Sandbox Code Playgroud)
基本上有点类似的东西pathOr,但对于对象上的方法.
我想我会使用Listmonad Option:
const getRoom = user => "currentRoom" in user ? [user.currentRoom()] : [];
const getMessages = room => "messages" in room ? room.messages() : [];
const allTogether = R.compose(R.chain(getMessage), R.chain(getRoom), R.of);
console.log(allTogether(Users.findOne({ username: params.id })));
Run Code Online (Sandbox Code Playgroud)