如何获知JSZip异步函数gatherWords执行完成时机
问题原因
你遇到的words输出为空问题,本质是forEach循环内触发的JSZip文件读取操作是异步Promise任务,forEach本身不会等待这些异步任务执行完毕,gatherWords()会在所有文件读取、单词拼接操作完成前就返回,此时words数组还没被填充,打印结果自然为空。
修复方案
核心思路是把所有异步文件读取的Promise收集起来,让gatherWords()返回一个Promise实例,在所有文件处理完成后才resolve结果,调用方等待这个Promise完成后再操作words数组即可。
修正后的可运行代码:
async function spellcheckePub() { const words = await gatherWords(); console.log(words); // 后续处理words的业务逻辑 } function gatherWords() { const words = []; // 存储所有文件读取处理的异步任务 const fileProcessTasks = []; masterePub.forEach(function (relativePath, file) { if (!file.dir) { const task = masterePub.file(file.name).async("text") .then(function (content) { const fileWords = content.split(/\s+/); words.push(...fileWords); }); fileProcessTasks.push(task); } }); // 所有文件处理完成后返回拼接好的单词数组 return Promise.all(fileProcessTasks).then(() => words); }
注意事项
- 不要依赖全局变量存储
words,把处理结果作为Promise resolve的返回值传递,能避免全局变量带来的时序、作用域污染问题 - 普通
forEach方法不会等待循环内的异步操作执行,不要用它处理需要等待异步任务的遍历场景 - 所有异步文件处理任务统一交给
Promise.all监听完成状态,你可以根据业务需求额外加.catch()做错误捕获,处理文件读取失败的场景
内容的提问来源于stack exchange,提问作者maddogandnoriko
相关产品推荐
相关产品推荐

