JavaScript 中的异步内部过滤器函数

Async inside filter function in JavaScript

const result = [1, 2, 3, 4, 5].filter(async (n) => n <= 3)

如果你 console.log(结果),你会得到 [1, 2, 3, 4, 5]。为什么不是 [1, 2, 3]?

如果您从函数中删除异步,您会得到 [1, 2, 3]。

我只是想知道为什么会这样。

filter 使用原始数组中的所有值创建一个新数组,其中您传递的函数 return 是一个 true 值。

async 履行 return 承诺。承诺是对象。对象是 true 值。


如果您想使用异步函数执行此操作,则需要等到解决了 promise 之后再测试真实性。

!async function() {

  const data = [1, 2, 3, 4, 5];
  const promises = data.map(async(n) => ({
    value: n,
    include: n <= 3
  }));
  const data_with_includes = await Promise.all(promises);
  const filtered_data_with_includes = data_with_includes.filter(v => v.include);
  const filtered_data = filtered_data_with_includes.map(data => data.value);
  console.log(filtered_data);

}();

或者,在不解释每个步骤的格式中:

!async function() {

  const result = (await Promise.all([1, 2, 3, 4, 5].map(async(n) => ({
    value: n,
    include: n <= 3
  })))).filter(v => v.include).map(data => data.value);

  console.log(result);

}();


您也可以避免在 for 循环

中使用有利于突变的功能方法

!async function() {

  const test = async(n) => n <= 3;
  const data = [1, 2, 3, 4, 5];
  const result = [];

  for (let i = 0; i < data.length; i++) {
    const value = data[i];
    if (await test(value)) result.push(value);
  }

  console.log(result);

}();