【问题标题】:Should I update my cache before or after I resolve my promise?我应该在履行承诺之前还是之后更新我的缓存?
【发布时间】:2019-09-22 03:12:15
【问题描述】:

在我的应用程序中,我从 API 获取信息并将其缓存。如果缓存未命中而我最终检索数据来存储它,我应该什么时候更新缓存?

当一个 promise 被执行时,resolve 不会停止函数其余部分的执行。我想尽快返回信息,所以如果我先解决承诺,然后更新缓存,我真的会获得任何性能优势吗?或者我是否正在为比赛条件或类似的事情做好准备?

这个

new Promise((resolve, reject) => {
  let result = getThingFromApi();
  resolve(result);
  updateCache(result); // returns promise
})

还是这个?

new Promise((resolve, reject) => {
  let result = getThingFromApi();
  updateCache(result); // returns promise
  resolve(result);
})

【问题讨论】:

  • 如果getThingFromApi() 返回一个承诺,则使用反模式。也不需要new Promise
  • 确保避免Promise constructor antipattern,以防getThingFromApi返回承诺!

标签: javascript node.js promise


【解决方案1】:

当一个 promise 被执行时,resolve 不会停止函数其余部分的执行。我想尽快返回信息,所以如果我先解决承诺,然后更新缓存,我真的会获得任何性能优势吗?或者我是否正在为比赛条件或类似的事情做好准备?

不,这对性能完全没有影响。 resolve 调用不做任何实际工作,例如调用承诺回调,它只是设置一个标志,表明承诺现在已用一个值解析,并安排其余的解析工作以备后用。 resolve() 本质上是异步的。因此,在这里调用它并不重要,引入异步正是为了防止这种竞争条件。

您唯一应该担心的是,如果您在之后放置 resolve(result) 并且 updateCache(result) 确实会引发异常,则不会执行它。

【讨论】:

    【解决方案2】:

    将承诺存储在缓存中并始终返回!

    无论如何,对数据的调用都必须是异步的,因为您不知道它是否被缓存,因此调用者必须期待异步结果。将 Promise 本身存储在缓存中并返回 Promise 可以解决所有同步问题。如果数据未缓存或过期,则您启动数据检索并同时将 Promise 存储在缓存中。如果再次调用相同的数据,您可以返回承诺,该承诺将在数据到达后立即解决。如果 promise 已经解析,则可以通过.then 立即检索结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 2021-01-04
      相关资源
      最近更新 更多