Javascript 为什么promise总是反复返回相同的数据?

Javascript 为什么promise总是反复返回相同的数据?,javascript,ecmascript-6,async-await,promise,Javascript,Ecmascript 6,Async Await,Promise,我遇到了麻烦,似乎承诺是一个变量 const num = Math.random() const fun = () => new Promise(resolve => resolve(num)) // Now, calling fun again and again, it gives me same result await fun() await fun() await fun() 如果我像下面那样使用它。然后,它会按预期工作: const fun = () => new

我遇到了麻烦,似乎承诺是一个变量

const num = Math.random()
const fun = () => new Promise(resolve => resolve(num))
// Now, calling fun again and again, it gives me same result
await fun()
await fun()
await fun()
如果我像下面那样使用它。然后,它会按预期工作:

const fun = () => new Promise(resolve => resolve(Math.random()))

如何像前面的示例那样使用常量变量解决此问题?

在第一个示例中,您生成一个随机数一次,然后从“fun”promise函数返回相同的数。在第二个示例中,每次调用“fun”时,您都会生成一个新的随机数。。

“如何像前面的示例一样使用常量变量解决此问题?”


你不能。如果使用常量变量,将得到常量结果。要得到不同的结果,您需要每次生成一个新的数字,如您给出的第二个示例所示。

很简单,您必须仔细观察函数和变量是如何工作的

  • 示例1:在
    num
    常量变量中,调用函数
    random()
    ,该函数返回一个浮点值并将其存储为
    num
    值。 然后调用
    fun()
const num=Math.random()//新承诺(resolve=>resolve(num))
//现在,一次又一次地称之为乐趣,它给了我同样的结果
等待乐趣
等待乐趣
等待乐趣
  • 示例2:再次调用
    fun()
    时,您将获得承诺中的解析值。但是,这一次不是来自变量的已初始化值。每次设置
    新承诺时,您都在调用
    random()
    方法
constfun=()=>新承诺(解析=>

resolve(Math.random())//您不能通过使用常量变量来解决这个问题,因为常量的整点是它永远不会改变。您的用例是什么导致您无法使用第二种形式?是的,承诺会缓存您使用的值,但这不是您的问题
fun()
确实像预期的那样为每个调用创建了一个新的承诺,只是您使用相同的常量
num
值来解析它们。公平地说,您可以使用一个常量函数来调用
Math.random()
函数并返回结果,而不是使用一个存储调用返回值的常量变量,但这在这里似乎是不必要的。我认为这要么是为了尝试承诺,要么这段代码不是您正在编写的完整/实际代码,只是以防万一:在这里使用承诺毫无意义
Math.random()
不是异步的,因此您可以立即返回它的值。(但如果您希望它总是像这里一样解析为特定值,也可以使用
Promise.resolve(Math.random())