You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在Array.filter中使用async-await?附代码与预期输出诉求

问题分析

你遇到的核心问题是 Array.filter() 不支持异步回调函数。checkCode是一个异步函数,它执行后会返回一个Promise对象,而在JavaScript里,Promise属于“真值”(truthy value)——哪怕这个Promise最终会resolve为false,filter也会把它当成true来处理,所以你的awardCodes里所有元素都会被保留下来,这就是为什么你得不到预期的空数组。

解决方案

要处理异步条件下的数组过滤,我们需要先等待所有异步判断完成,再根据结果来过滤原数组。可以用Promise.all()结合map来实现:

修改后的完整代码

var awardCodes = [1, 2, 3, 11];

function getPosts() {
  const response = fetch("https://jsonplaceholder.typicode.com/user");
  return response;
}

// 把test改成异步函数,或者用.then处理结果
async function test(awardCodes) {
  // 先通过map获取所有异步判断的结果
  const checkResults = await Promise.all(awardCodes.map(checkCode));
  // 再根据结果过滤原数组
  const arr = awardCodes.filter((_, index) => checkResults[index]);
  console.log(arr, awardCodes);
}

var checkCode = async (code) => {
  try {
    let res = await getPosts();
    if (res.status == 200) {
      console.log("true");
      return true;
    } else {
      console.log("false1");
      return false;
    }
  } catch (error) {
    console.log("false2");
    return false;
  }
}

test(awardCodes);

关键改动说明

  • 把test函数改为异步函数,用await Promise.all()等待所有checkCode的异步操作完成,拿到所有判断结果的数组checkResults。
  • 再用filter遍历原数组,根据checkResults对应位置的布尔值来决定是否保留元素。

这样就能准确实现你想要的“仅保留请求响应成功时的元素”的逻辑了。

内容的提问来源于stack exchange,提问作者kiranbabu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:07:42