为何重复调用封装的Promise函数时总会返回相同的固定结果?
问题本质
固定返回值的现象和Promise本身的缓存机制没有任何关系,核心是JavaScript的词法作用域与变量声明时机的规则:
- 初始写法中,
const num = Math.random()声明在fun函数的外层作用域,这行代码只会在脚本初始化时执行一次,生成的随机值会被持久存在num常量中,后续永远不会改变。 - 每次调用
fun()时,只是将这个从未更新的num值传入Promise的resolve方法,因此无论调用多少次,拿到的都是同一个固定结果。
保留常量写法的解决方案
如果希望沿用“在Promise逻辑中用命名常量存储计算值”的写法,同时实现每次调用返回新随机数的效果,只需要将外层声明的num常量移动到fun函数的内部作用域即可:
const fun = () => { // 每次调用fun时,都会创建独立的函数作用域,重新执行这行代码生成新的随机数 const num = Math.random() return new Promise(resolve => resolve(num)) }
这种写法的运行逻辑:
- 每次调用
fun()时,函数内部的num常量都是全新作用域下的独立变量,不会跨调用共享 - 每次生成的随机数会被存在当次调用对应的局部常量里,完全符合预期的动态返回效果
- 不需要将
Math.random()直接作为参数塞给resolve,保留了代码的可读性与常量命名的规范。
原理验证:哪怕移除所有Promise逻辑,只要把
num声明在函数外层,直接通过普通函数返回num值,也会得到每次调用结果固定的表现——这完全是JS作用域的固有规则,和Promise的异步处理、缓存逻辑没有关联。
内容的提问来源于stack exchange,提问作者gacat。
相关产品推荐
相关产品推荐

