在我的应用程序中,我从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);
})
答案 0 :(得分:1)
当执行诺言时,
resolve
不会停止执行其余功能。我想尽快返回该信息,因此,如果我先解决承诺,然后更新缓存,我是否会真正获得性能收益?还是我要为比赛条件或类似的事情做好准备?
不,性能完全不重要。 resolve
调用不会像调用promise回调那样做任何实际的工作,它仅设置一个标志,表明现在可以使用一个值来解决promise,并安排其余的解析工作供以后使用。 resolve()
本质上是异步的。因此,在这里您在哪里称呼它都没有关系,正是为了防止此类竞争状况而引入了异步功能。
您唯一需要担心的是,如果之后放置resolve(result)
并且updateCache(result)
确实抛出异常,则不会执行。
答案 1 :(得分:0)
将诺言存储在缓存中并始终将其返回!
无论如何,对数据的调用都必须一定是异步的,因为您不知道它是否已缓存,因此调用方必须期望异步结果。将诺言本身存储在缓存中并返回诺言可以解决所有同步问题。如果数据没有被缓存或过时,则您将启动数据检索,并将promise存储在缓存中。如果再次调用相同的数据,则可以返回承诺,该承诺将在数据到达后立即解决。如果承诺已经解决,则可以立即通过extension=mysqli.so
检索结果。