如何结合async/await使用数组遍历方法,判断所有元素是否通过可抛异常的异步测试
结合async/await实现异步校验数组所有元素的方案
你给出的示例代码无法得到正确结果,因为原生Array.every是同步方法,不会等待异步函数exists返回的Promise resolve/reject,会直接把Promise实例当作真值处理,最终allExists会永远是true,也无法捕获exists抛出的异步错误。
你可以根据场景选择以下两种实现方案:
方案1:并行执行(性能最优,适合无并发限制场景)
所有异步测试同时执行,适合测试函数没有并发调用限制的场景,执行速度最快。
如果需求是只要有一个测试抛出错误/返回false就判定整体不通过,可以用更简洁的Promise.all实现:
const exists = async (num) => { // 你的异步校验逻辑,可能抛出错误 return num > 0; // 示例逻辑 } const checkAllExists = async (arr) => { try { // 并行执行所有异步测试 const resultList = await Promise.all(arr.map(exists)); // 校验所有返回值是否为真 return resultList.every(Boolean); } catch { // 任意测试抛出错误,直接判定不通过 return false; } } // 调用方式 const allExists = await checkAllExists([12, 5, 8, 130, 44]);
如果你需要区分「测试返回false」和「测试抛出错误」两种情况,可以把Promise.all替换为Promise.allSettled,自行判断每个结果的状态和返回值。
方案2:串行执行(适合有并发限制场景)
逐个执行异步测试,只要遇到不通过的情况就终止后续测试,适合测试函数有调用频率限制、或者单次执行开销较大的场景,资源消耗更低:
const checkAllExistsSerial = async (arr) => { for (const item of arr) { try { const isPass = await exists(item); if (!isPass) return false; } catch { // 测试抛出错误直接判定不通过 return false; } } // 所有元素都通过测试 return true; }
内容的提问来源于stack exchange,提问作者Serhii Shliakhov
相关产品推荐
相关产品推荐

