Remove rejected promises from the cache
Summary: Rejected promises in the cache would prevent the cache from persisting. This removes rejected promises from the cache, so that subsequent successful cache updates can be persisted. Reviewed By: cpojer Differential Revision: D3726691 fbshipit-source-id: ddec03676a7a89264fe64b4af4b183cbead638fb
This commit is contained in:
parent
c36d356f6c
commit
754da27d94
|
@ -153,6 +153,30 @@ describe('Cache', () => {
|
|||
)
|
||||
);
|
||||
});
|
||||
|
||||
it('does not cache rejections', () => {
|
||||
fs.stat.mockImpl((file, callback) => {
|
||||
callback(null, {
|
||||
mtime: {
|
||||
getTime: () => {},
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
var cache = new Cache({
|
||||
cacheKey: 'cache',
|
||||
});
|
||||
var loaderCb = () => Promise.reject('lol');
|
||||
|
||||
return cache
|
||||
.get('/rootDir/someFile', 'field', loaderCb)
|
||||
.catch(() => {
|
||||
var shouldBeCalled = jest.fn(() => Promise.resolve());
|
||||
const assert = value => expect(shouldBeCalled).toBeCalled();
|
||||
return cache.get('/rootDir/someFile', 'field', shouldBeCalled)
|
||||
.then(assert, assert);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('loading cache from disk', () => {
|
||||
|
|
|
@ -87,7 +87,7 @@ class Cache {
|
|||
this._data[filepath].metadata = Object.create(null);
|
||||
}
|
||||
|
||||
record.data[field] = loaderPromise
|
||||
const cachedPromise = record.data[field] = loaderPromise
|
||||
.then(data => Promise.all([
|
||||
data,
|
||||
denodeify(fs.stat)(filepath),
|
||||
|
@ -106,7 +106,9 @@ class Cache {
|
|||
return data;
|
||||
});
|
||||
|
||||
return record.data[field];
|
||||
// don't cache rejected promises
|
||||
cachedPromise.catch(error => delete record.data[field]);
|
||||
return cachedPromise;
|
||||
}
|
||||
|
||||
_persistCache() {
|
||||
|
|
Loading…
Reference in New Issue