我应该在履行承诺之前还是之后更新缓存?

时间:2019-09-21 18:58:15

标签: javascript node.js promise

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

当执行诺言时,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);
})

2 个答案:

答案 0 :(得分:1)

  

当执行诺言时,resolve不会停止执行其余功能。我想尽快返回该信息,因此,如果我先解决承诺,然后更新缓存,我是否会真正获得性能收益?还是我要为比赛条件或类似的事情做好准备?

不,性能完全不重要。 resolve调用不会像调用promise回调那样做任何实际的工作,它仅设置一个标志,表明现在可以使用一个值来解决promise,并安排其余的解析工作供以后使用。 resolve()本质上是异步的。因此,在这里您在哪里称呼它都没有关系,正是为了防止此类竞争状况而引入了异步功能。

您唯一需要担心的是,如果之后放置resolve(result)并且updateCache(result)确实抛出异常,则不会执行。

答案 1 :(得分:0)

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

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