Javascript Ramda-部分应用的功能取决于完全应用
我想增加的价值取决于未来的价值,即Javascript Ramda-部分应用的功能取决于完全应用,javascript,functional-programming,ramda.js,Javascript,Functional Programming,Ramda.js,我想增加的价值取决于未来的价值,即 let metadata = {videoId: 123, likes: 400}; let addSubtitles = R.assoc('subtitles', R.__, R.__); 此处addSubtitles是一个部分应用的函数。但是,addSubtitles的第二个参数应该是字幕,但是字幕本身取决于第三个参数,即metadata.videoId。以下简称: addSubtitles(metadata); //but with another a
let metadata = {videoId: 123, likes: 400};
let addSubtitles = R.assoc('subtitles', R.__, R.__);
此处addSubtitles
是一个部分应用的函数。但是,addSubtitles
的第二个参数应该是字幕,但是字幕本身取决于第三个参数,即metadata.videoId
。以下简称:
addSubtitles(metadata); //but with another argument perhaps?
const subtitles = async getSubtitles(videoId) => await apiCall(videoId);
有没有办法以功能性的方式解决这个问题?如果我把未来的第三个论点的上下文绑定起来,但不确定如何去做,这似乎是可能的
请让我知道,如果有任何额外的信息需要回答
这是一个可行的解决方案,尽管我希望使用Ramda来实现这一点:
const addSubs = async function(el) {¬
const subtitles = await writeCaptions(el.videoId);¬
return R.assoc('subtitles', subtitles, el);¬
};
首先让我回顾一下,请注意,签名中的后续值不需要使用
R.\uu
。Ramda库中的几乎每个函数都是自动生成的,因此您可以使用所有参数或某个子集进行调用以预加载数据<代码>R.仅用于为将来的呼叫保留空间
所以,你想要做的就是不断地一次添加一个参数,直到你准备好调用一个完整的函数。当顺序错误时,您可以使用R.flip
或R.
(取决于上下文)来达到您准备填充的值,然后返回到您还不知道的值
因此,从您的描述来看,您似乎担心getSubtitles(metadata)
是一个返回承诺的网络调用。本例将在该假设下继续进行。在这里,我认为R.flip
比R.更能表达你的想法
const metadata = { videoId: 123, likes: 400 }
const addSubtitles = R.flip(R.assoc('subtitles'))
// Now you have a curried function that takes 2 arguments, first the metadata, and then the subtitles.
const withSubtitlesPromise = getSubtitles(metadata)
// Here we drill down a little further by adding the metadata, and then
// pass it as the callback to .then, which will pass in the final param
// once it resolves
.then(addSubtitles(metadata)
withSubtitlesPromise.then(console.log)
您完全可以在一个函数中捕获所有这些逻辑,该函数接受元数据
,并返回对字幕数据的承诺。为了更好地测量,我们还将作为依赖项传递getSubtitles
,以便于测试和弱耦合。现在,交换另一个检索字幕数据的函数是很简单的。在本例中,使用R.\uu
会使代码更干净一些,因此我们将对其进行切换
// Define all the logic in a single easy function
const makeAddSubtitles = getSubtitles => metadata =>
getSubtitles(metadata).then(R.assoc('subtitles', R._, metadata))
// Then push in the dependency
const addSubtitles = makeAddSubtitles(getSubtitles)
// Use it
const vid123 = { videoId: 123, likes: 400 }
const vid123WithSubsPromise = addSubtitles(vid123)
首先让我回顾一下,请注意,签名中的后续值不需要使用R.\uu
。Ramda库中的几乎每个函数都是自动生成的,因此您可以使用所有参数或某个子集进行调用以预加载数据<代码>R.
仅用于为将来的呼叫保留空间
所以,你想要做的就是不断地一次添加一个参数,直到你准备好调用一个完整的函数。当顺序错误时,您可以使用R.flip
或R.
(取决于上下文)来达到您准备填充的值,然后返回到您还不知道的值
因此,从您的描述来看,您似乎担心getSubtitles(metadata)
是一个返回承诺的网络调用。本例将在该假设下继续进行。在这里,我认为R.flip
比R.更能表达你的想法
const metadata = { videoId: 123, likes: 400 }
const addSubtitles = R.flip(R.assoc('subtitles'))
// Now you have a curried function that takes 2 arguments, first the metadata, and then the subtitles.
const withSubtitlesPromise = getSubtitles(metadata)
// Here we drill down a little further by adding the metadata, and then
// pass it as the callback to .then, which will pass in the final param
// once it resolves
.then(addSubtitles(metadata)
withSubtitlesPromise.then(console.log)
您完全可以在一个函数中捕获所有这些逻辑,该函数接受元数据
,并返回对字幕数据的承诺。为了更好地测量,我们还将作为依赖项传递getSubtitles
,以便于测试和弱耦合。现在,交换另一个检索字幕数据的函数是很简单的。在本例中,使用R.\uu
会使代码更干净一些,因此我们将对其进行切换
// Define all the logic in a single easy function
const makeAddSubtitles = getSubtitles => metadata =>
getSubtitles(metadata).then(R.assoc('subtitles', R._, metadata))
// Then push in the dependency
const addSubtitles = makeAddSubtitles(getSubtitles)
// Use it
const vid123 = { videoId: 123, likes: 400 }
const vid123WithSubsPromise = addSubtitles(vid123)
我不是真的想问这个问题,也许是因为我需要去睡觉。但是有一条评论是,R.assoc('subtitles',R.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;我的问题可能不清楚。我编辑了这个问题,添加了一个解决方案,但我正在寻找一个特定于Ramda的解决方案。让我知道这是否能澄清问题。我并没有真正理解这个问题,也许是因为我需要去睡觉。但是有一条评论是,R.assoc('subtitles',R.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;我的问题可能不清楚。我编辑了这个问题,添加了一个解决方案,但我正在寻找一个特定于Ramda的解决方案。让我知道这是否能澄清问题。谢谢你的回答。这很有意义,唯一的区别在于我的问题中的字幕功能取决于元数据本身的属性。我更新了问题,以更好地反映这一点,并提出了一个可能的解决方案。虽然你的回答让我相信我的解决方案是唯一的方法(我一直在寻找一个ramda特定的答案),但请再次通读这个例子。我想你错过了。您添加的“工作解决方案”简化为写入选项(el.videoId)。然后(R.assoc('subtitles',R.\uel))
谢谢您的回答。这很有意义,唯一的区别在于我的问题中的字幕功能取决于元数据本身的属性。我更新了问题,以更好地反映这一点,并提出了一个可能的解决方案。虽然你的回答让我相信我的解决方案是唯一的方法(我一直在寻找一个ramda特定的答案),但请再次通读这个例子。我想你错过了。您添加的“工作解决方案”简化为写入选项(el.videoId)