Javascript 如何在FP(Ramda.js)中重写此函数?
我有这个函数,我想知道,应该如何用FP风格(使用Ramda.js)编写它Javascript 如何在FP(Ramda.js)中重写此函数?,javascript,functional-programming,ramda.js,Javascript,Functional Programming,Ramda.js,我有这个函数,我想知道,应该如何用FP风格(使用Ramda.js)编写它 registerUser(用户名、密码)->客户端id、客户端密码 getUserAccessToken(用户名、密码、客户端id、客户端密码)-> 访问令牌、刷新令牌、刷新令牌到期 保存到存储:客户端\u id、客户端\u机密、访问\u令牌、刷新\u令牌、刷新令牌到期 这与拉姆达或FP无关。您有一个函数执行三种不同的操作(身份验证、令牌请求和持久性),这就是您的问题所在 const registered = authAP
这与拉姆达或FP无关。您有一个函数执行三种不同的操作(身份验证、令牌请求和持久性),这就是您的问题所在
const registered = authAPI.registerUser(username, password)
.catch(err => showUserRegisterErr(err));
const token = registered.then(({client_id, client_secret}) => {
return Promise.all([
Promise.resolve({client_id, client_secret}),
authAPI.getUserAccessToken(
username,
password,
client_id,
client_secret
)
]);
});
const persisted = token.then((
{client_id, client_secret},
{access_token, refresh_token, refreshTokenExpiresAt}
) => {
return store.update('user', {
client_id,
client_secret,
access_token,
refresh_token,
refreshTokenExpiresAt,
});
});
persisted.catch(err => { throw err; });
现在,这些都是常量值,而不是函数,所以让我们来解决这个问题:
// No .catch, caller can catch errors if it wants. Also
// no more registerUser function, it was a thin layer over
// the auth API with error handling and we'll delegate to
// the caller for that.
const getToken = (username, password, registration) => {
return registration.then(({client_id, client_secret}) => {
return Promise.all([
username,
password,
client_id,
client_secret,
authAPI.getUserAccessToken(
username,
password,
client_id,
client_secret
)
]);
});
};
const persist = datastore => ([
client_id,
client_secret,
{
access_token,
refresh_token,
refreshTokenExpiresAt
}
]) => {
return store.update('user', {
client_id,
client_secret,
access_token,
refresh_token,
refreshTokenExpiresAt,
});
});
const persistToDB = persist(store);
const signUp = (username, password) => {
return getToken(username, password, authAPI.registerUser(username, password))
.then(persistToDB)
.catch(showUserRegistrationErr);
};
现在,所有不同的部件都可以独立测试。由于注册是作为参数传递给getToken
的,因此可以使用模拟承诺对其进行测试。与持久性函数类似。您还可以模拟authAPI.registerUser
函数
除了在持久性函数中,没有任何状态发生变化,函数只使用它们的参数,等等。我还对数据存储进行了参数化,以便您可以交换持久性(或将其存根用于测试)。这与Ramda或FP无关。您有一个函数执行三种不同的操作(身份验证、令牌请求和持久性),这就是您的问题所在
const registered = authAPI.registerUser(username, password)
.catch(err => showUserRegisterErr(err));
const token = registered.then(({client_id, client_secret}) => {
return Promise.all([
Promise.resolve({client_id, client_secret}),
authAPI.getUserAccessToken(
username,
password,
client_id,
client_secret
)
]);
});
const persisted = token.then((
{client_id, client_secret},
{access_token, refresh_token, refreshTokenExpiresAt}
) => {
return store.update('user', {
client_id,
client_secret,
access_token,
refresh_token,
refreshTokenExpiresAt,
});
});
persisted.catch(err => { throw err; });
现在,这些都是常量值,而不是函数,所以让我们来解决这个问题:
// No .catch, caller can catch errors if it wants. Also
// no more registerUser function, it was a thin layer over
// the auth API with error handling and we'll delegate to
// the caller for that.
const getToken = (username, password, registration) => {
return registration.then(({client_id, client_secret}) => {
return Promise.all([
username,
password,
client_id,
client_secret,
authAPI.getUserAccessToken(
username,
password,
client_id,
client_secret
)
]);
});
};
const persist = datastore => ([
client_id,
client_secret,
{
access_token,
refresh_token,
refreshTokenExpiresAt
}
]) => {
return store.update('user', {
client_id,
client_secret,
access_token,
refresh_token,
refreshTokenExpiresAt,
});
});
const persistToDB = persist(store);
const signUp = (username, password) => {
return getToken(username, password, authAPI.registerUser(username, password))
.then(persistToDB)
.catch(showUserRegistrationErr);
};
现在,所有不同的部件都可以独立测试。由于注册是作为参数传递给getToken
的,因此可以使用模拟承诺对其进行测试。与持久性函数类似。您还可以模拟authAPI.registerUser
函数
除了在持久性函数中,没有任何状态会发生变化,函数只使用它们的参数,等等。我还对数据存储进行了参数化,以便您可以交换持久性(或将其存根用于测试)