#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, которое будет вызываться само по себе.