如何避免重复调用Promise?解决Promise执行时机与重复执行问题
解决方案
核心思路是缓存Promise实例,确保不管调用多少次,只会创建一次Promise,executor函数仅执行一次。
实现方式:用闭包缓存已创建的Promise,每次调用函数时先检查是否已有实例,有则直接返回,没有则创建并缓存。
const getMyPromise = (() => { let cachedPromise = null; return () => { if (!cachedPromise) { cachedPromise = new Promise(function(resolve, reject) { console.log("Called"); resolve(10); }); } return cachedPromise; }; })(); (async () => { console.log(await Promise.race([getMyPromise()])); console.log(await Promise.all([getMyPromise()])); })();
原理说明
- 利用立即执行函数表达式创建闭包,保存
cachedPromise变量,外部无法直接修改。 - 第一次调用
getMyPromise()时,cachedPromise为null,创建Promise实例并缓存,此时executor函数执行,打印"Called"。 - 后续再调用
getMyPromise(),直接返回已缓存的Promise实例,不会重新创建,所以executor不会重复执行。 - 不管是
Promise.race还是Promise.all,使用的都是同一个Promise实例,既满足了延迟执行(首次调用时才创建),又避免了重复执行。
内容的提问来源于stack exchange,提问作者user38643
相关产品推荐
相关产品推荐

