如何对接第三方API:在回调函数中获取Promise返回值?
解决方案
核心矛盾在于:runExternalTransaction要求传入同步回调(不能返回Promise),但getNewData是异步操作,无法在同步回调中直接返回结果。我们可以通过**分两次调用runExternalTransaction**的方式解决,先检查当前数据,再按需传入异步获取的新数据,同时用Promise封装整个流程让调用方可以异步处理结果。
具体实现代码
// 封装后的对接函数 function processTransaction(): Promise<any> { return new Promise((resolve) => { // 第一次调用:检查是否存在当前数据 runExternalTransaction((currentData) => { if (currentData) { // 有数据直接返回并结束流程 resolve(currentData); return currentData; } // 无数据时返回占位符,后续再处理 return undefined; }); }).then((existingData) => { // 如果已有数据,直接返回 if (existingData) return existingData; // 无数据时异步获取新数据 return getNewData().then((newData) => { return new Promise((resolve) => { // 第二次调用:将新数据传入事务 runExternalTransaction(() => { resolve(newData); return newData; }); }); }); }); } // 使用示例 processTransaction().finally(() => { console.log("事务处理完成"); });
逻辑说明
- 第一次调用
runExternalTransaction:仅用于获取当前数据currentData,如果数据存在,直接返回结果并结束流程。 - 无数据时异步获取新数据:调用
getNewData()等待异步结果。 - 第二次调用
runExternalTransaction:将异步获取到的newData作为回调的返回值传入,完成事务逻辑。 - 用Promise封装整个流程:让调用方可以通过
then/await处理最终结果,符合异步代码的使用习惯。
注意事项
- 如果
runExternalTransaction是有状态的事务(比如不能重复调用),需要先确认其是否支持这种分两次调用的模式。 - 如果
getNewData可能抛出错误,可以在代码中添加catch块处理异常:return getNewData().then((newData) => { // ... }).catch((error) => { console.error("获取新数据失败:", error); throw error; // 向上抛出错误让调用方处理 });
内容的提问来源于stack exchange,提问作者appsofteng
相关产品推荐
相关产品推荐

