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

ATS库retrieveEnvelope方法带回调调用时返回值不符合预期

问题排查与解决方案

核心问题根源

你遇到的问题本质是对retrieveEnvelope的回调机制理解偏差:该方法的回调并非用来转换返回值,而是作为结果接收的通知入口。你假设回调的return会被方法作为自身返回值,但实际上不管回调里返回什么,retrieveEnvelope都会直接返回原始的envelope对象(或异步结果),你的回调逻辑根本没生效。

另外,你当前的代码存在同步/异步混淆:loadEnvelope用Promise包裹,但getFromATS同步返回retrieveEnvelope的结果,如果回调是异步触发的,同步返回的只会是未处理的原始对象。

解决方案

方案一:改用Promise模式(推荐)

根据文档说明,不传回调时retrieveEnvelope返回Promise,这种方式逻辑更清晰,避免回调歧义:

private getFromATS(): Promise<string> {
  return this._window.ats.retrieveEnvelope()
    .then(envelopeStr => {
      let parsed = JSON.parse(envelopeStr);
      // 处理嵌套结构
      while ('envelope' in parsed && typeof parsed.envelope === 'object') {
        parsed = parsed.envelope;
      }

      // 提取目标字符串
      if ('envelope' in parsed && typeof parsed.envelope === 'string') {
        if (parsed.envelope.includes('envelope')) {
          const jsonString = JSON.parse(parsed.envelope);
          return jsonString.envelope;
        }
        return parsed.envelope;
      }
      throw new Error('Malformed ATS response');
    });
}

private loadEnvelope(): Promise<string> {
  return retryPromise<string>(
    () => {
      if (this.ATSOnPage()) {
        return this.getFromATS();
      }
      throw new Error('Some other error');
    },
    this.maxATSRetrievalRetries,
    this.retryDelay
  );
}

方案二:修正回调用法(若必须用回调)

如果一定要使用回调,需要将getFromATS改为返回Promise,在回调内部手动resolve处理后的结果:

private getFromATS(): Promise<string> {
  return new Promise((resolve, reject) => {
    this._window.ats.retrieveEnvelope((envelopeStr: string) => {
      try {
        let parsed = JSON.parse(envelopeStr);
        while ('envelope' in parsed && typeof parsed.envelope === 'object') {
          parsed = parsed.envelope;
        }

        if ('envelope' in parsed && typeof parsed.envelope === 'string') {
          let result;
          if (parsed.envelope.includes('envelope')) {
            const jsonString = JSON.parse(parsed.envelope);
            result = jsonString.envelope;
          } else {
            result = parsed.envelope;
          }
          resolve(result);
        } else {
          reject(new Error('Malformed ATS response'));
        }
      } catch (err) {
        reject(err);
      }
    });
  });
}

验证效果

修改后,loadEnvelope返回的Promise会正确resolve到你预期的字符串fasdfasdf,updatedOrNewEnvelopeWrapper就能拿到处理后的值。

内容的提问来源于stack exchange,提问作者Niko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:50:33