【问题标题】:Why promise always returns same data over and again?为什么 promise 总是一次又一次地返回相同的数据?
【发布时间】:2021-07-24 18:38:42
【问题描述】:

我遇到了麻烦,似乎 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 Promise(resolve => resolve(Math.random()))

如何使用前面例子中的常量变量来解决这个问题?

【问题讨论】:

  • 不能通过使用常量变量来解决这个问题,因为常量的全部意义在于它永远不会改变。您有什么用例导致您无法使用第二种形式?
  • 是的,promise 缓存了你解决它的值,但这不是你的问题。 fun() 确实在每次调用时都会按预期创建一个新的承诺,只是您使用相同的 constant num 值解决所有这些问题。
  • 公平地说,您可以使用一个常量 function 调用 Math.random() 函数并返回结果,而不是使用常量 variable存储调用的返回,但这里似乎没有必要。
  • 我认为这要么是为了尝试承诺,要么这个 sn-p 不是你正在制作的完整/实际代码,但以防万一:在这里使用 Promises 毫无意义. Math.random() 不是异步的,所以你可以立即返回它的值。 (但是如果您希望它始终像您在此处所做的那样解析为特定值,您也可以使用Promise.resolve(Math.random())。)

标签: javascript ecmascript-6 async-await promise


【解决方案1】:

在第一个示例中,您生成了一个随机数一次,然后您从“有趣”的 promise 函数中返回相同的数字。在第二个示例中,您生成一个随机数每次您称之为“有趣”。

【讨论】:

    【解决方案2】:

    “我怎样才能像前面的例子一样使用常量变量来解决这个问题?”

    你不能。如果你使用 constant 变量,你会得到一个 constant 结果。要获得不同的结果,您需要每次都生成一个新数字,就像您给出的第二个示例一样。

    【讨论】:

      【解决方案3】:

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

      • 示例 1:在num 常量变量中调用函数random(),它返回一个浮点并将其存储为num 值。 然后你调用fun(),它返回一个Promise 并从num 解析一个已经初始化的值
          const num = Math.random() // <= HERE!
          const fun = () => new Promise(resolve => resolve(num))
          // Now, calling fun again and again, it gives me same result
          await fun()
          await fun()
          await fun()
      
      • 示例 2:当您再次调用 fun() 时,您会在 Promise 中获得解析后的值。但是,这一次不是已经从变量初始化的值。每次设置 new Promise 时,您都会调用 random() 方法。
        const fun = () => new Promise(resolve => 
                                             resolve(Math.random())) // <= HERE!
      

      【讨论】:

        猜你喜欢
        • 2015-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-01
        • 2017-02-16
        • 1970-01-01
        • 2017-11-30
        • 2016-05-26
        相关资源
        最近更新 更多