Node.js中async/await未等待进程执行完毕就执行后续代码如何解决
问题原因
- 最常见的原因是:
await getStatistics()所在的外层作用域没有声明为async函数。非async函数内使用await会直接抛出语法错误,如果没有捕获该异常,JS会跳出当前逻辑直接执行后续代码,看起来就像await没有生效。 - 如果你是在CommonJS模块的顶层直接写
await语句,Node.js不支持CommonJS下的顶层await,同样会触发语法错误导致后续代码提前执行。 calculateStatistics函数自定义的Promise没有错误处理逻辑:如果文件读取、PNG解析过程中出现错误,该Promise永远不会触发resolve或reject,如果上层有异常捕获逻辑跳过了这部分等待,也会导致后续代码提前执行。
修复方案
- 把包含
await的代码放到async函数内,如果是顶层调用可以用立即执行异步函数包裹:
// 方式1:普通异步函数调用 async function main() { await getStatistics(); let bb = getTileGeoJsonBB(tileInfo); } main() // 方式2:立即执行异步函数 (async () => { await getStatistics(); let bb = getTileGeoJsonBB(tileInfo); })()
- 给
calculateStatistics添加错误捕获逻辑,避免Promise永远处于pending状态:
module.exports.calculateStatistics = async function (inputFilePath) { const png = new PNG({}) return new Promise((resolve, reject) => { const readStream = fs.createReadStream(inputFilePath) // 监听流错误,异常时直接reject readStream.on('error', reject) png.on('error', reject) readStream .pipe(png) .on("parsed", () => { resolve(getTileStatistics(png)) }) }) }
- 修正
getTileStatistics的变量声明,避免隐式创建全局变量引发不可预期的问题:
let getTileStatistics = function (png) { // 显式声明stats变量 const stats = {}; stats.minHeight = Number.MAX_VALUE; stats.maxHeight = Number.MIN_VALUE; return stats }
内容的提问来源于stack exchange,提问作者dan
相关产品推荐
相关产品推荐

