为何AWS Textract异步Promise中变量被重复计算?
问题根源
你遇到的问题是同时使用AWS SDK的回调模式和Promise模式调用startDocumentAnalysis,导致发起了两次独立的API请求,因此生成了两个不同的JobId,日志里的成功信息也重复打印了两次。
AWS SDK的设计逻辑是:调用方法时传入回调函数,会立即触发一次请求并通过回调返回结果;如果同时链式调用.promise(),会再次触发一次请求并返回Promise对象。两种模式混用就会导致重复请求。
修改方案
只保留Promise+async/await的写法,移除回调函数,统一用try/catch处理错误。
修改后的完整代码:
async function textParse(config) { const AWS = require("aws-sdk"); let textract = new AWS.Textract(); let analysisResults; console.log("Before Try"); try { console.log("Start Document Analysis"); // 移除回调参数,仅使用Promise方式调用 analysisResults = await textract.startDocumentAnalysis(config).promise(); console.log("Doc analysis successful!"); console.log(analysisResults); } catch (e) { console.log("There was an error during doc analysis..."); console.log(e, e.stack); throw "Doc Analysis Error!" + e; } const JobId = analysisResults.JobId; const textractResult = await textract.getDocumentAnalysis({ JobId }).promise(); console.log("End!") return textractResult; }
关键修改点
- 移除
startDocumentAnalysis的第二个回调参数,避免触发回调模式的重复请求 - 将成功日志移到
await之后,确保仅在请求成功完成后打印一次 - 错误处理完全交给try/catch,统一捕获Promise的reject异常
- 可选优化:用直接属性访问简化
JobId的获取(analysisResults.JobId)
内容的提问来源于stack exchange,提问作者Wronski
相关产品推荐
相关产品推荐

