Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在FP(Ramda.js)中重写此函数?_Javascript_Functional Programming_Ramda.js - Fatal编程技术网

Javascript 如何在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风格(使用Ramda.js)编写它

  • registerUser(用户名、密码)->客户端id、客户端密码
  • getUserAccessToken(用户名、密码、客户端id、客户端密码)-> 访问令牌、刷新令牌、刷新令牌到期
  • 保存到存储:客户端\u id、客户端\u机密、访问\u令牌、刷新\u令牌、刷新令牌到期

  • 这与拉姆达或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
    函数

    除了在持久性函数中,没有任何状态会发生变化,函数只使用它们的参数,等等。我还对数据存储进行了参数化,以便您可以交换持久性(或将其存根用于测试)