TypeScript中如何在Promise外部使用其返回值?
问题原因
这是典型的异步代码时序问题:
fetchSomeData是异步函数,调用它返回的Promise会在后续事件循环中完成,.then()里的回调要等异步操作结束才会执行。- 而
returnData是同步函数,return result语句会在.then()回调执行前就运行,此时result还是初始的undefined,所以返回值始终是undefined。
修复方案
要让returnData正确返回string类型的值,必须处理异步逻辑的等待,最简单的方式是把returnData改成异步函数,用await等待异步结果:
// 给fetchSomeData补全返回类型,明确它返回Promise<string> async function fetchSomeData(): Promise<string> { // 替换成你的实际异步逻辑,比如接口请求等 return Promise.resolve("your actual data"); } async function returnData(): Promise<string> { // 用await等待异步操作完成,直接拿到结果 const result = await fetchSomeData(); return result; }
调用注意
因为returnData现在返回Promise<string>,调用它的地方需要用await或者.then()来获取最终的string值:
// 方式1:在async函数里用await async function useData() { const data = await returnData(); // data此时是string类型,可直接使用 } // 方式2:用.then()处理 returnData().then(data => { // data是string类型 });
额外说明
- 不要用
let result!: undefined这种写法:非空断言!会绕过TypeScript的类型检查,但本质上解决不了异步时序问题,反而会隐藏类型错误。 - 同步函数不可能直接返回异步操作的结果:异步操作的结果只能通过
Promise或者回调传递,如果必须让returnData的调用方拿到同步的string,只能重构逻辑,确保fetchSomeData的结果在调用returnData之前就已获取完成,但这在大多数场景下不现实。
内容的提问来源于stack exchange,提问作者Jigyasu Tanwar
相关产品推荐
相关产品推荐

