JavaScript async/await执行顺序问题:forEach后数组输出为空如何解决
问题根因
你当前遇到的执行顺序问题核心原因是:Array.prototype.forEach 不支持等待异步回调执行完成。你传入forEach的async函数返回的Promise会被直接忽略,forEach只会同步触发所有异步任务,不会等待任何异步逻辑执行完毕就会继续执行后续的外部打印代码,所以才会出现外部打印先执行、数组为空的情况。
解决方案
将forEach替换为map收集所有异步任务的Promise,再通过Promise.all等待所有异步任务全部执行完成后,再执行外部打印逻辑。注意需要将当前外层作用域改为async函数,才能使用await语法。
修改后的代码示例
// 外层作用域必须是async函数,比如: async function yourFunctionName() { const arrayTracker = [] const response = [] // 你的原始数据源 // 用map替换forEach,收集所有异步任务的Promise const promises = response.map(async (element: any) => { const formatJson = JSON.parse(element[1]) if (formatJson !== null) { const dayDifference = daysDiff(formatJson.closedTimeStamp, Date.now()) if (dayDifference > 7) { arrayTracker.push(formatJson) } } else { if (element[0] === '@notify_1_2') { // @ts-ignore async function checkStorage() { const json = await AsyncStorage.getItem('@alarm') const response = JSON.parse(json!) let dayDifference: any if (json !== null) { dayDifference = daysDiff(response, Date.now()) } if (dayDifference > 7 || dayDifference == null) { return { id: 1, priority: 1 } } } arrayTracker.push(await checkStorage()) console.log('array tracker below push:', arrayTracker) } else { arrayTracker.push({ id: 0, priority: 0 }) } } }) // 等待所有异步任务执行完成 await Promise.all(promises) // 此时arrayTracker已经填充完成,打印结果符合预期 console.log('array tracker outside function:', arrayTracker) }
如果外层作用域无法改为async函数,可以用Promise.all的then回调处理后续逻辑:
Promise.all(promises).then(() => { console.log('array tracker outside function:', arrayTracker) })
补充说明
这个修改方案可以保证所有异步存储读取、日期校验、数组push操作全部执行完成后,才会执行外部的打印逻辑,输出顺序和结果完全符合你的预期。
内容的提问来源于stack exchange,提问作者nikomannelig
相关产品推荐
相关产品推荐

