Skip to content

Commit d7132ab

Browse files
authored
fix: use the latest generator instance after dependency change. (#26)
* test: add failing test. * fix: move generator commit effect above generator run effect.
1 parent fe7160b commit d7132ab

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

src/use-async-effect.spec.tsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,3 +359,34 @@ it("calls a clenup function returned by the generator when dependencies change",
359359
expect(callable).toHaveBeenCalledTimes(2);
360360
done();
361361
});
362+
363+
it("calls latest generator reference upon dependency change", async done => {
364+
const callable = jest.fn();
365+
let setState: (i: number) => void = () => 1;
366+
367+
const TestComponent: React.FC<{}> = () => {
368+
const [state, _setState] = React.useState(0);
369+
setState = _setState;
370+
useAsyncEffect(
371+
function*() {
372+
yield Promise.resolve();
373+
callable(state);
374+
},
375+
[state]
376+
);
377+
return null;
378+
};
379+
380+
const { unmount } = render(<TestComponent />);
381+
await Promise.resolve();
382+
expect(callable).toHaveBeenCalledWith(0);
383+
384+
act(() => {
385+
setState(1);
386+
});
387+
await Promise.resolve();
388+
389+
expect(callable).toHaveBeenCalledWith(1);
390+
unmount();
391+
done();
392+
});

src/use-async-effect.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ export const useAsyncEffect = (
1414
) => {
1515
const generatorRef = useRef(createGenerator);
1616

17+
useEffect(() => {
18+
generatorRef.current = createGenerator;
19+
});
20+
1721
useEffect(() => {
1822
let isCanceled = false;
1923
let onCancel = noop;
@@ -66,8 +70,4 @@ export const useAsyncEffect = (
6670
cleanupHandler();
6771
};
6872
}, deps);
69-
70-
useEffect(() => {
71-
generatorRef.current = createGenerator;
72-
});
7373
};

0 commit comments

Comments
 (0)