Есть ли способ реорганизовать эти вызовы Promises в «лучшие практики кодирования»? - PullRequest
0 голосов
/ 27 января 2019

Мой код работает нормально, я просто хочу продолжить поиск этой функции поиска с хорошими методами кодирования.Я чувствую, что повторяю один и тот же код слишком много раз.У меня есть два разных типа объектов "программы" и "аренда", если пользователь выбрал один из обоих в меню поиска. Я хочу искать в моей БД только по указанному объекту, однако, если он выбирает оба или ни одного, я хочу выполнить обе функции поиска,Чтобы добиться этого, у меня есть условное условие, которое проверяет эти параметры поиска, если выбран только один, я выполню соответствующий find () в соответствующей схеме,

if((queryObj.selectedSearchObjectType.indexOf("rentals") > -1))
  {
     let foundRentalsByTitle = await Promise.all(titleSplited.map((value) =>
               getRentalsByQuery({title: { $regex: new RegExp('\\b' + value.toLowerCase() + '\\b', 'i') } } )
           ));
      searchResults.rentals = searchResults.rentals.concat(foundRentalsByTitle);
   }

Однако, как вы можете заметить, яЯ повторяю один и тот же код 4 раза, чтобы достичь этого, я хочу использовать хорошие методы кодирования, поэтому я думаю, что это выглядит некрасиво и неэффективно.

1 Ответ

0 голосов
/ 27 января 2019

Может быть что-то вроде этого:

if(!queryObj.title) return; // just exit from the function or return representation of an empty result


queryObj.title = queryObj.title.trim();
const titleSplited = queryObj.title.split(' ');//transform it to an array

if(titleSplited.length <= 0) return; // same as above

// define the holder for search operations
const searchPromises = {};

if(!queryObj.selectedSearchObjectType || queryObj.selectedSearchObjectType.indexOf("rentals") > -1)
{
  searchPromises.rentals = Promise.all(titleSplited.map((value) =>
    getRentalsByQuery({title: { $regex: new RegExp('\\b' + value.toLowerCase() + '\\b', 'i') } } )
  ));
}

if(!queryObj.selectedSearchObjectType || queryObj.selectedSearchObjectType.indexOf("programs") > -1)
{
  searchPromises.programs = Promise.all(titleSplited.map((value) =>
    getProgramsByQuery({title: { $regex: new RegExp('\\b' + value.toLowerCase() + '\\b', 'i') } } )
  ));
}

if (searchPromises.rentals) {
  searchResults.rentals = searchResults.rentals.concat(await searchPromises.rentals);
}

if (searchPromises.programs) {
  searchResults.programs = searchResults.programs.concat(await searchPromises.programs);
}

// Filter results code ...
// .........................
// End of Function

Позже мы можем определить тип поиска, а также извлечь функции поиска:

const RENTALS = 'rentals';
const PROGRAMS = 'programs';

const searchFns = {
  [RENTALS]: (value) => getRentalsByQuery({title: { $regex: new RegExp('\\b' + value.toLowerCase() + '\\b', 'i') } } ),
  [PROGRAMS]: (value) => getProgramsByQuery({title: { $regex: new RegExp('\\b' + value.toLowerCase() + '\\b', 'i') } } )
};

Таким образом, вы можете изменить свою функцию на:

if(!queryObj.title) return; // just exit from the function or return representation of an empty result

queryObj.title = queryObj.title.trim();
const titleSplited = queryObj.title.split(' ');//transform it to an array

if(titleSplited.length <= 0) return; // same as above

// define the holder for search operations
const searchPromises = {};
const searchTypes = [RENTALS, PROGRAMS];

searchTypes.forEach((type) => {
  if(!queryObj.selectedSearchObjectType || queryObj.selectedSearchObjectType.indexOf(type) > -1)
  {
    searchPromises[type] = Promise.all(titleSplited.map(searchFns[type]));
  }
});

// iterate over created promises
for (let type in searchPromises) {
  searchResults[type] = searchResults[type].concat(await searchPromises[type])
}

// Filter results code ...
// .........................
// End of Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...