如何将属性设置为应该解析的值...就像这个..
const getDataFromServer = (id) => ({id: * 2})
R.set(payloadProp, getDataFromServer)({id: 4}); // WRONG, is setting to a function instend to resolve a function with `{id: 4}`
const fetch = (id) => {
return { num: id * 2 }
};
const idProp = R.lensProp('id');
const getDataFromServer = R.pipe(R.view(idProp), fetch);
const payloadProp = R.lensProp('payload');
const setPayloadFromFetch = R.set(payloadProp, getDataFromServer); // NOT WORK, return payload as function
const obj = { id: 1, payload: { message: 'request' } }
const ret = setPayloadFromFetch(obj);
console.log(ret);

<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.23.0/ramda.min.js"></script>
&#13;
答案 0 :(得分:2)
问题是R.set
为其第二个参数获取值而不是函数。并且你不能切换到R.over
,它确实需要函数但是用该镜头的当前值调用它,而不是提供给外部函数的完整数据对象。
解决这个问题的最简单方法就是在两个地方传递对象:
const setPayloadFromFetch = obj => R.set(payloadProp, getDataFromServer(obj), obj);
但是如果你打算让这一点免费,lift
就是你的朋友:
const setPayloadFromFetch = R.lift(R.set(payloadProp))(getDataFromServer, identity);
虽然您也可以使用R.ap
,但这会非常好,除非R.set
以错误的顺序获取参数,因此您必须使用R.flip
const setPayloadFromFetch = R.ap(R.flip(R.set(payloadProp)), getDataFromServer);
您可以在 Ramda REPL 中看到所有这些内容。