2017-09-12 4 views
0

나는이 기능을 가지고 있으며, FP 스타일 (Ramda.js 포함)으로 어떻게 작성해야하는지 궁금합니다.FP (Ramda.js)에서이 함수를 다시 작성하는 방법은 무엇입니까?

  1. registerUser (사용자 이름, 암호) -> CLIENT_ID, client_secret;
  2. getUserAccessToken (사용자 이름, 비밀번호, 클라이언트 ID, 클라이언트 _ 비밀) -> 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와는 아무 상관이있다. 세 가지 기능 (인증, 토큰 요청 및 지속성)을 수행하는 한 가지 기능이 있으며 이것이 문제입니다.

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에 매개 변수로 전달되므로 모의 약속으로 테스트 할 수 있습니다. persistence 함수와 마찬가지로. authAPI.registerUser 기능을 조종 할 수도 있습니다.

퍼시스턴스 함수를 제외하고는 상태가 변하지 않습니다. 함수는 매개 변수 만 사용합니다. 또한 데이터 저장소를 매개 변수화하여 지속성을 바꾸거나 테스트를 위해 스텁 할 수 있습니다.