无法在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
相关产品推荐
相关产品推荐

