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)