簡體   English   中英

如何在FP(Ramda.js)中重寫此函數?

[英]How to rewrite this function in FP (Ramda.js)?

我有這個功能,我想知道如何用FP風格(用Ramda.js)編寫它。

  1. registerUser(用戶名,密碼)-> client_id,client_secret;
  2. getUserAccessToken(用戶名,密碼,client_id,client_secret)-> access_token,refresh_token,refreshTokenExpiresAt;
  3. 保存到存儲: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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM