【问题标题】:How to refactor code when I want to use return value of function as a global variable?当我想将函数的返回值用作全局变量时如何重构代码?
【发布时间】:2021-06-17 16:51:36
【问题描述】:

我想重构以下函数:

export const getUserData = async (req: Request, res: Response) => {
  
   const client = getClient()

   const nameResult = await client.rpc.make('user/getName', user)

   let nameStatus

   if (!nameResult) {
      // Throw error
   } else {
      // Do something useful
   }

   const isNice = await client.rpc.make('user/isNice', user);   
   // ... Fetching various other data ...
}

我想了解有关获取用户名的全部内容,并希望将其放入不同的函数中,因此我的 getUserData 函数将更具可读性。我正在做很多与此类似的其他事情,我希望它们中的每一个最终都在自己的相应功能中。所以我创建了我的专用 getName 函数:

const client = getClient()

const getName = async (user) => {
    const nameResult = await client.rpc.make('user/getName', user)

    let nameStatus

    if (!nameResult) {
       // Throw error
    } else {
       // Do something useful
    }

    return nameStatus
}

export const getUserData = async (req: Request, res: Response) => {
   const nameStatus = await getName(user)

   const isNice = await client.rpc.make('user/isNice', user);   
   // ... Fetching various other data ...
}

现在我的目标实现了,我的 getUserData 函数更短了。但现在还有另一个问题。这两个功能都需要客户端。在重构之前,我是在函数体中拿到的,所以没有问题。但是现在我想像全局变量一样使用它,而我的函数无法访问它。我的猜测是 getClient 函数实际上永远不会运行,因为我只是在从另一个文件中使用这些函数时才调用我的 getUserResult 函数。当 getClient 调用在 getUserData 函数中时,它实际上被调用了,因为我从另一个文件中调用了这个函数,但现在它只是全局存在而没有运行它。如何创建一个可以在下面所有函数中使用的全局客户端变量?

【问题讨论】:

  • 我不明白为什么全局变量对你不起作用。
  • 为什么初始化全局变量时getClient()函数没有返回?
  • @Barmar 你是对的,我已经插入了调用 getClient 函数的行
  • 谢谢。我仍然没有看到重构版本的问题。应该初始化全局变量
  • @Barmar 函数没有返回,因为我运行的不是文件本身,而是导出的函数

标签: javascript node.js global-variables refactoring


【解决方案1】:

如果您的要求是每次在所有函数之前运行 getClient 函数,那么您可以将其转换为 IIFE 表达式,该表达式将自行调用。

【讨论】:

    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2020-09-11
    • 2019-11-28
    • 1970-01-01
    相关资源
    最近更新 更多