From 9e20146f7fa3dfb5e8be1c42bf5d84214d3e8439 Mon Sep 17 00:00:00 2001 From: David Aurelio Date: Tue, 16 Aug 2016 17:39:09 -0700 Subject: [PATCH] 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 --- .../node-haste/Cache/__tests__/Cache-test.js | 24 +++++++++++++++++++ react-packager/src/node-haste/Cache/index.js | 6 +++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/react-packager/src/node-haste/Cache/__tests__/Cache-test.js b/react-packager/src/node-haste/Cache/__tests__/Cache-test.js index 2c8b0f6f..c466e50f 100644 --- a/react-packager/src/node-haste/Cache/__tests__/Cache-test.js +++ b/react-packager/src/node-haste/Cache/__tests__/Cache-test.js @@ -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', () => { diff --git a/react-packager/src/node-haste/Cache/index.js b/react-packager/src/node-haste/Cache/index.js index 4a0349ab..c86544a2 100644 --- a/react-packager/src/node-haste/Cache/index.js +++ b/react-packager/src/node-haste/Cache/index.js @@ -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() {