Array.filter() с функцией асинхронной стрелки

#javascript #arrays

#javascript #массивы

Вопрос:

Я пытаюсь отфильтровать свой массив с помощью Array.filter() функции, однако я столкнулся с этой проблемой. Мне нужно вызвать какую-то другую функцию внутри filter функции асинхронно. Однако массив не изменяет свое значение в зависимости от условий, которые я определяю в функции.

 const filterWithEmail = data.filter(async (doc) =>
{
   const findUser = await UserService.findUser(doc.id).catch(err => {});
   if (findUser)
   {
      const { email } = findUser;
      return regexFilter ? regexFilter.test(email.normalize("NFKC")) : false;
   }
});
  

По какой-то причине этот код вообще не влияет на data массив.
Есть предложения, что я делаю не так?

Заранее благодарю вас.

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

1. .filter ожидает синхронный предикат. Поскольку вы предоставляете асинхронную функцию, она просто принимает возвращенное обещание как истинное значение и предполагает, что все проходит.

Ответ №1:

filter ожидается, что возвращаемое значение обратного вызова будет логическим, но async функции всегда возвращают обещание.

Вы не знаете, хотите ли вы вернуться true или false вовремя сообщить filter , что это такое.

Что вы, возможно, хотите сделать, это:

  1. map данные из data в { keep: true, original_data: data } (с использованием async обратного вызова)
  2. Передайте результирующий массив обещаний в Promise.all
  3. await возвращаемое значение Promise.all
  4. filter этот массив с: .filter(data => data.keep)
  5. Верните исходные объекты с помощью .map(data => data.original_data)

Что-то в этом роде (непроверенное):

 const filterWithEmail = (
  await Promise.all(
    data.map(async (data) => {
      const findUser = await UserService.findUser(doc.id).catch((err) => {});
      let keep = false;
      if (findUser amp;amp; regexFilter)
        keep = regexFilter.test(email.normalize("NFKC"));
      return { data, keep };
    })
  )
)
  .filter((data) => data.keep)
  .map((data) => data.data);