You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 08:54:23