Как рефакторировать код, когда я хочу использовать возвращаемое значение функции в качестве глобальной переменной?

#javascript #node.js #global-variables #refactoring

Вопрос:

Я хочу провести рефакторинг следующей функции:

 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, он действительно был вызван, потому что я вызвал эту функцию из другого файла, но теперь она просто существует глобально, даже не запуская ее. Как я могу создать глобальную клиентскую переменную, которую я могу использовать во всех своих функциях ниже?

Комментарии:

1. Я не понимаю, почему глобальная переменная не работает для вас.

2. Почему функция не getClient() возвращается при инициализации глобальной переменной?

3. @Barmar Вы правы, я вставил строку, в которой вызываю функцию getClient

4. Спасибо. Я все еще не вижу проблемы с переработанной версией. Глобальная переменная должна быть инициализирована

5. @Barmarфункция не возвращается, потому что я запускаю не сам файл, а экспортированную функцию

Ответ №1:

Если ваше требование состоит в том, чтобы запускать функцию getClient каждый раз перед всеми функциями, вы можете преобразовать ее в выражение IIFE, которое будет вызываться само по себе.