Skip to content

Commit 88d297a

Browse files
don't swallow async errors in sync generator
1 parent cef4a3b commit 88d297a

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

modules/Coroutine.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,9 @@ function create(asyncFn) {
7676
function resolveSyncIterator(i, step, cb) {
7777
if (!step.done) {
7878
if (isPromiseLike(step.value)) {
79-
return step.value.then(data => resolveSyncIterator(i, i.next(data), cb));
79+
return step.value
80+
.then(data => resolveSyncIterator(i, i.next(data), cb))
81+
.catch(error => resolveSyncIterator(i, i.throw(error), cb));
8082
} else {
8183
return resolveSyncIterator(i, i.next(step.value), cb);
8284
}

modules/__tests__/Coroutine-test.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,22 @@ describe('Coroutine', () => {
6262
expect(tree.toJSON()).toEqual(result.toJSON());
6363
});
6464

65+
it('should rethrow exceptions back to generator', async () => {
66+
function* render() {
67+
try {
68+
yield Promise.reject(new Error('Boom'));
69+
} catch (error) {
70+
return <p>{error.message}</p>;
71+
}
72+
}
73+
74+
let TestComponent = Coroutine.create(render);
75+
let tree = await Renderer.create(<TestComponent />);
76+
77+
let result = await Renderer.create(<p>Boom</p>);
78+
expect(tree.toJSON()).toEqual(result.toJSON());
79+
});
80+
6581
it('should restart coroutine on new props', async () => {
6682
let getData = jest.fn(n => Promise.resolve(n * 2));
6783
let trap = jest.fn();

0 commit comments

Comments
 (0)