如何将异步函数闭包为Promise以延迟执行并存入Map?
解决方案
你遇到的核心问题是:Promise的执行器(executor)在创建时就会同步执行,直接调用getSomeData()会立即触发请求。要实现延迟调用,有两种可行方案:
方案1:调整Map类型为函数(推荐)
将Map的值类型改为返回Promise的函数,这样存储的是待执行的逻辑而非立即执行的Promise:
// 修改Map的类型定义 const somedataMap: Map<string, () => Promise<SomeData>> = new Map(); // 存储函数,此时不会调用getSomeData somedataMap.set("someId", () => getSomeData("someId")); // 当需要数据时,再调用函数触发执行 const targetData = await somedataMap.get("someId")();
这种方式逻辑清晰,明确表达了"延迟执行"的意图,还能按需重复发起请求(每次调用函数都会重新执行getSomeData)。
方案2:保持原Map类型,创建惰性Promise
如果无法修改Map的类型,可以通过Promise.resolve().then()创建一个惰性触发的Promise——只有当你await它或者调用then()时,才会执行getSomeData:
// 保持原Map类型不变 const somedataMap: Map<string, Promise<SomeData>> = new Map(); // 存储惰性Promise,此时不会执行getSomeData somedataMap.set("someId", Promise.resolve().then(() => getSomeData("someId"))); // 当需要数据时,await才会触发getSomeData执行 const targetData = await somedataMap.get("someId");
注意:这种方式下,同一个Promise只会执行一次getSomeData,后续的await会直接返回缓存的结果。
内容的提问来源于stack exchange,提问作者Taeo
相关产品推荐
相关产品推荐

