From 03c02b059405f8c25f98e191f577b34eec9f95d3 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Thu, 16 May 2019 08:56:14 -0700 Subject: [PATCH 1/2] Avoid synchronous error. Fixes #160. --- src/module.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/module.js b/src/module.js index 5f1610e9..47ff3557 100644 --- a/src/module.js +++ b/src/module.js @@ -47,14 +47,15 @@ function module_variable(observer) { return new Variable(TYPE_NORMAL, this, observer); } -function module_value(name) { +async function module_value(name) { var v = this._scope.get(name); if (!v) throw new RuntimeError(name + " is not defined"); if (v._observer === no_observer) { v._observer = true; this._runtime._dirty.add(v); } - return this._runtime._compute().then(() => v._promise); + await this._runtime._compute(); + return v._promise; } function module_derive(injects, injectModule) { From 4413641999de466b681f22aec1a8f1420b9d8a1a Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Thu, 16 May 2019 08:58:10 -0700 Subject: [PATCH 2/2] Test module.value error. --- test/module/value-test.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/module/value-test.js b/test/module/value-test.js index 431937c1..27836056 100644 --- a/test/module/value-test.js +++ b/test/module/value-test.js @@ -62,6 +62,18 @@ tape("module.value(name) supports missing variables", async test => { } }); +tape("module.value(name) returns a promise on error", async test => { + const runtime = new Runtime(); + const module = runtime.module(); + const promise = module.value("bar"); + try { + await promise; + test.fail(); + } catch (error) { + test.deepEqual(error.message, "bar is not defined"); + } +}); + tape("module.value(name) does not force recomputation", async test => { let foo = 0; const runtime = new Runtime();