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
相关产品推荐
相关产品推荐

