2017-09-12 12 views
0

私はこの機能を持っており、FPスタイル(Ramda.js)でどのように記述すればよいのでしょうか。FP(Ramda.js)でこの関数を書き換える方法は?

  1. のregisterUser(ユーザー名、パスワード) - >のclient_id、client_secret。
  2. getUserAccessToken(username、password、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); 
    } 
} 

答えて

3

これはRAMDAまたはFPとは何の関係もありません。 3つの異なる機能(認証、トークン要求、および永続性)を行う関数が1つあり、それが問題です。

// 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); 
}; 

今、すべての異なる部分が独立してテスト可能です:

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; }); 

は今、これらはとてもこれを修正することができます、すべての定数値ではなく、機能しています。登録はパラメータとしてgetTokenに渡されるので、模擬約束でテストすることができます。パーシスタンス関数と同様です。また、authAPI.registerUser機能をモックアウトすることもできます。

永続化機能を除いて、状態は変更されていません。関数はパラメータのみを使用します。また、永続性を取り除く(またはテスト用にスタブする)ようにデータストアをパラメータ化しました。

関連する問題