From 753046a9381adb76c5f08ec54fe23ebb3231dd89 Mon Sep 17 00:00:00 2001 From: Andrey Kogut Date: Fri, 14 Oct 2016 19:16:58 +0300 Subject: [PATCH 1/3] Dispose reaction on error --- src/observer.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/observer.js b/src/observer.js index fbd044f3..68070fce 100644 --- a/src/observer.js +++ b/src/observer.js @@ -85,7 +85,13 @@ const reactiveMixin = { // If we are unmounted at this point, componentWillReact() had a side effect causing the component to unmounted // TODO: remove this check? Then react will properly warn about the fact that this should not happen? See #73 // However, people also claim this migth happen during unit tests.. - React.Component.prototype.forceUpdate.call(this) + let hasError = true; + try { + React.Component.prototype.forceUpdate.call(this); + hasError = false; + } finally { + if (hasError) reaction.dispose(); + } } } }); From 48319ccc018b7482d55399b13f989e861b6a6835 Mon Sep 17 00:00:00 2001 From: Andrey Kogut Date: Mon, 7 Nov 2016 22:06:30 +0200 Subject: [PATCH 2/3] Added test for #134 --- test/observer.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/test/observer.js b/test/observer.js index c8c15c7e..16b89c81 100644 --- a/test/observer.js +++ b/test/observer.js @@ -300,4 +300,31 @@ test("component should not be inject", function(t) { t.equal(msg.length, 1); console.warn = baseWarn; t.end(); +}); + +test("should stop updating if error was thrown in render (#134)", function(t) { + var data = mobx.observable(0); + var renderingsCount = 0; + + var comp = observer(function() { + renderingsCount += 1; + if (data.get() === 2) { + throw new Error("Hello"); + } + return e("div", {}); + }); + + ReactDOM.render(e(comp), testRoot, function() { + data.set(1); + t.throws(function() { + data.set(2); + }, "Hello"); + data.set(3); + data.set(4); + data.set(5); + + t.equal(renderingsCount, 3); + + t.end(); + }); }); \ No newline at end of file From c67781cc5d19eaf62044bbe4c59690217261568f Mon Sep 17 00:00:00 2001 From: Andrey Kogut Date: Tue, 8 Nov 2016 12:34:47 +0200 Subject: [PATCH 3/3] Added test for #134 --- test/observer.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/observer.js b/test/observer.js index 16b89c81..0a6b248f 100644 --- a/test/observer.js +++ b/test/observer.js @@ -315,10 +315,12 @@ test("should stop updating if error was thrown in render (#134)", function(t) { }); ReactDOM.render(e(comp), testRoot, function() { + t.equal(data.observers.length, 1); data.set(1); t.throws(function() { data.set(2); }, "Hello"); + t.equal(data.observers.length, 0); data.set(3); data.set(4); data.set(5); @@ -327,4 +329,4 @@ test("should stop updating if error was thrown in render (#134)", function(t) { t.end(); }); -}); \ No newline at end of file +});