gpt4 book ai didi

javascript - lambda : Is there a way to 'fork' a parameter to two functions during pipe?

转载 作者:行者123 更新时间:2023-12-01 15:55:34 25 4
gpt4 key购买 nike

我是一个函数式编程初学者。我正在使用 Ramda 开发 React Native 应用程序。该应用程序可让用户维护自己的房屋。

我写了一个名为 asyncPipe 的函数这让我可以管道 promise 和正常功能。我将它用于 loginFlow当前有一个 http 请求( getHouseList )作为它的最后一个函数。

const asyncPipe = (...fns) => x => fns.reduce(async (y, f) => f(await y), x);

const loginFlow = asyncPipe(
// ... someFunctions
getHouseList
);

// used later like this in LoginForm.js's handleSubmit():
const list = await loginFlow(credentials);

因此,登录后,应用程序会加载用户的房屋。现在取决于他是否只有一所或多所房子,如果他只有一所房子,我想向用户发送 ListView 以选择房子或详细 View 。此外,我想调度一个 Redux 操作来将列表保存在我的 reducer 中,如果只有一个,则另一个操作来选择房子。

目前我这样做:
const list = await loginFlow(credentials);
dispatch(addHouses(list));
if (list.length > 1) {
navigate('ListScreen')
} else {
dispatch(pickHouse(list[0]);
navigate('DetailScreen') ;
}

但正如你所看到的,这是非常必要的。似乎我必须“ fork ”列表并在管道中使用它两次(因为 Redux' dispatch 没有返回值)。

我的主要问题是:

如何以更具功能性/声明性的方式执行此操作(如果有办法)?

我有一个小问题,在这里是否可以强制执行/如果这样做是一个好主意。

最佳答案

你可以使用类似 tap 的东西来扩展你的异步管道。 :

const loginFlow = asyncPipe(
// ... some functions
getHouseList,
tap(compose(dispatch, addHouses)),
tap(unless(list => list.length > 1, list => dispatch(pickHouse(list[0])))),
list => navigate(list.length > 1 ? 'ListScreen' : 'DetailScreen', list)
);

这是否值得做将取决于您的应用程序。如果管道已经很长,那么以这种方式将内容添加到末尾可能会更清晰,即使它们不是特别功能性的部分。但是对于较短的管道,这可能没有多大意义。

您可能还想查看现已弃用的 pipeP或其替代品, pipeWith ( then )。

但是您在标题中询问了关于 fork 参数的问题。 Ramda 的 converge 正是这样做的:
converge(f, [g, h])(x) //=> f(g(x), h(x))

这也允许您传递两个以上的函数,并将多个参数传递给结果函数:
converge(f, [g, h, i])(x, y) //=> f(g(x, y), h(x, y), i(x, y)) 

关于javascript - lambda : Is there a way to 'fork' a parameter to two functions during pipe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54787024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com