带有异步箭头功能的Array.filter()

时间:2020-11-10 14:35:16

标签: javascript arrays

我正在尝试使用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 个答案:

答案 0 :(得分:3)

filter期望回调的返回值是一个布尔值,但是async函数总是返回一个Promise。

您不知道是否要及时返回truefalse来告知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 && regexFilter)
        keep = regexFilter.test(email.normalize("NFKC"));
      return { data, keep };
    })
  )
)
  .filter((data) => data.keep)
  .map((data) => data.data);