![](/img/trans.png)
[英]How to rewrite a FP library Ramda.js function called 'pathSatisfies' in vanilla JS
[英]How to rewrite this function in FP (Ramda.js)?
我有這個功能,我想知道如何用FP風格(用Ramda.js)編寫它。
- registerUser(用戶名,密碼)-> client_id,client_secret;
- getUserAccessToken(用戶名,密碼,client_id,client_secret)-> access_token,refresh_token,refreshTokenExpiresAt;
- 保存到存儲:client_id,client_secret,access_token,refresh_token,refreshTokenExpiresAt。
async function registerUser(username: string, password: string) {
try {
const { client_id, client_secret } = await authAPI.registerUser(username, password);
// get tokens
const {
access_token,
refresh_token,
refreshTokenExpiresAt,
} = await authAPI.getUserAccessToken(username, password, client_id, client_secret);
// save to async storage
store.update('user', {
client_id,
client_secret,
access_token,
refresh_token,
refreshTokenExpiresAt,
});
} catch (err) {
throw Error(err);
}
}
這與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
函數。
除了持久性函數外,沒有其他任何狀態會發生變化,函數僅使用其參數,等等。我還對數據存儲區進行了參數化,以便可以交換持久性(或將其存根進行測試)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.