Skip to content

Commit 0e8cc29

Browse files
authored
Merge pull request #10 from kouhin/release/v2.1.0
Release/v2.1.0
2 parents 384985e + 3f11ef4 commit 0e8cc29

File tree

4 files changed

+38
-22
lines changed

4 files changed

+38
-22
lines changed

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ function counter(state = 0, action) {
4747

4848
const store = createStore(
4949
counter,
50-
applyMiddleware(createMemoizeMiddleware()),
50+
applyMiddleware(createMemoizeMiddleware({ ttl: 200 })),
5151
);
5252

5353
store.dispatch(increment());
@@ -69,7 +69,7 @@ console.info(promise1 === promise2); OUTPUT: true
6969
setTimeout(() => {
7070
store.dispatch(memoizeIncrement());
7171
console.info(store.getState()); // OUTPUT: 4
72-
}, 200);
72+
}, 500);
7373
```
7474

7575
**It works perfectly with [redux-thunk](https://github.com/gaearon/redux-thunk)**
@@ -104,7 +104,7 @@ const fetchUserRequest = memoize({ ttl: 1000 }, (username) => {
104104

105105
const store = createStore(
106106
rootReducer,
107-
applyMiddleware(createMemoizeMiddleware(), thunk),
107+
applyMiddleware(createMemoizeMiddleware({ ttl: 200 }), thunk),
108108
);
109109

110110
// Component1
@@ -145,15 +145,15 @@ Memoize actionCreator and returns a memoized actionCreator. When dispatch action
145145

146146
- (Promise): will be resolved with the result of original actionCreator.
147147

148-
### createMemoizeMiddleware(globalOpts, disableTTL)
148+
### createMemoizeMiddleware(globalOpts)
149149

150150
Create a redux [middleware](http://redux.js.org/docs/advanced/Middleware.html).
151151

152152
#### Arguments
153153

154154
- `globalOpts` _Object <optional>_
155-
- _Object_: Default opts for memorize().
156-
- **Default**: `{ ttl: 0, enabled: true, isEqual: lodash.isEqual }`]
155+
- _Object_: Default opts for memorize().
156+
- **Default**: `{ ttl:0, enabled: true, isEqual: lodash.isEqual }`]. **ttl is REQUIRED, You SHOULD set a ttl > 0 in millisecond**
157157
- There is another options `disableTTL`. The default value is `true` on server and `false` on browser. By default, cached action creator will not be evicted by setTimeout with TTL on server in order to prevent memory leak. You can enable it for test purpose.
158158

159159
#### Returns

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "redux-memoize",
3-
"version": "2.0.0",
3+
"version": "2.1.0",
44
"description": "Memoize action creator for redux, and let you dispatch common/thunk/promise/async action whenever you want to, without worrying about duplication",
55
"main": "lib/index.js",
66
"directories": {

src/index.js

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
/* eslint no-restricted-syntax:0 */
21
import lodashIsEqual from 'lodash/isEqual';
32

43
const ACTION_TYPE = '@redux-memoize/action';
54

65
const DEFAULT_META = {
7-
ttl: 200,
6+
ttl: 0,
87
enabled: true,
98
isEqual: lodashIsEqual,
109
};
@@ -18,7 +17,9 @@ const canUseDOM = !!(
1817
);
1918

2019
function deepGet(map, args, isEqual) {
21-
for (const key of map.keys()) {
20+
const keys = Array.from(map.keys());
21+
for (let i = 0, len = keys.length; i < len; i += 1) {
22+
const key = keys[i];
2223
if (isEqual(key, args)) {
2324
return map.get(key);
2425
}
@@ -27,8 +28,11 @@ function deepGet(map, args, isEqual) {
2728
}
2829

2930
export default function createMemoizeMiddleware(options = {}) {
31+
if (canUseDOM && options.ttl === undefined) {
32+
throw new Error('[createMemoizeMiddleware(globalOptions)] globalOptions.ttl is REQUIRED');
33+
}
3034
const {
31-
// default disableTTL is true on server side, to prevent memory leak (use GC to remove cache)
35+
// default disableTTL is true on server side, to prevent memory leak (use GC to evict cache)
3236
disableTTL = !canUseDOM,
3337
...globalOptions
3438
} = options;
@@ -72,11 +76,12 @@ export default function createMemoizeMiddleware(options = {}) {
7276
};
7377
middleware.getAll = () => {
7478
const result = [];
75-
for (const fnCache of cache.values()) {
76-
for (const value of fnCache.values()) {
79+
const cacheValues = Array.from(cache.values());
80+
cacheValues.forEach((fnCache) => {
81+
Array.from(fnCache.values()).forEach((value) => {
7782
result.push(value);
78-
}
79-
}
83+
});
84+
});
8085
return result;
8186
};
8287
return middleware;

test/middleware.spec.js

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import createMemoizeMiddleware, { memoize } from '../src/index';
66

77
function configureStore(reducer) {
88
return compose(
9-
applyMiddleware(createMemoizeMiddleware(), thunkMiddleware),
9+
applyMiddleware(createMemoizeMiddleware({ ttl: 200 }), thunkMiddleware),
1010
)(createStore)(reducer);
1111
}
1212

@@ -96,7 +96,15 @@ describe('memoize', () => {
9696
describe('middleware', () => {
9797
const doDispatch = () => {};
9898
const doGetState = () => {};
99-
const nextHandler = createMemoizeMiddleware()({ dispatch: doDispatch, getState: doGetState });
99+
const nextHandler = createMemoizeMiddleware({
100+
ttl: 200,
101+
})({ dispatch: doDispatch, getState: doGetState });
102+
103+
it('must throw an error when ttl is not passed', () => {
104+
expect(() => {
105+
createMemoizeMiddleware();
106+
}).toThrow();
107+
});
100108

101109
it('must return a function to handle next', () => {
102110
expect(typeof nextHandler).toBe('function');
@@ -153,7 +161,7 @@ describe('middleware', () => {
153161
args: [1, 2],
154162
},
155163
};
156-
const nextHandler1 = createMemoizeMiddleware()({
164+
const nextHandler1 = createMemoizeMiddleware({ ttl: 200 })({
157165
dispatch: (action) => {
158166
expect(action).toBe(originalAction);
159167
done();
@@ -170,7 +178,7 @@ describe('middleware', () => {
170178
describe('handle errors', () => {
171179
it('must throw if argument is not a function', () => {
172180
expect(() => {
173-
createMemoizeMiddleware()();
181+
createMemoizeMiddleware({ ttl: 200 })();
174182
}).toThrow();
175183
});
176184
});
@@ -196,7 +204,7 @@ describe('unit test', () => {
196204
};
197205
});
198206

199-
const memoizeMiddleware = createMemoizeMiddleware();
207+
const memoizeMiddleware = createMemoizeMiddleware({ ttl: 200 });
200208

201209
const store = applyMiddleware(
202210
memoizeMiddleware,
@@ -235,7 +243,7 @@ describe('unit test', () => {
235243
payload: num,
236244
}));
237245

238-
const memoizeMiddleware = createMemoizeMiddleware({ disableTTL: false });
246+
const memoizeMiddleware = createMemoizeMiddleware({ ttl: 200, disableTTL: false });
239247

240248
const store = applyMiddleware(
241249
memoizeMiddleware,
@@ -381,7 +389,7 @@ describe('unit test', () => {
381389
};
382390
});
383391

384-
const memoizeMiddleware = createMemoizeMiddleware();
392+
const memoizeMiddleware = createMemoizeMiddleware({ ttl: 200 });
385393

386394
const store = applyMiddleware(
387395
thunkMiddleware,
@@ -439,6 +447,7 @@ describe('unit test', () => {
439447
});
440448

441449
const memoizeMiddleware = createMemoizeMiddleware({
450+
ttl: 200,
442451
disableTTL: false,
443452
});
444453

@@ -536,6 +545,7 @@ describe('unit test', () => {
536545
}
537546

538547
const memoizeMiddleware = createMemoizeMiddleware({
548+
ttl: 200,
539549
disableTTL: false,
540550
});
541551

@@ -594,6 +604,7 @@ describe('unit test', () => {
594604
}
595605

596606
const memoizeMiddleware = createMemoizeMiddleware({
607+
ttl: 200,
597608
disableTTL: false,
598609
});
599610

0 commit comments

Comments
 (0)