From c9cd9773408299921ca3a0ef242af590e3ebb80f Mon Sep 17 00:00:00 2001 From: Bryan Donovan Date: Wed, 4 Feb 2015 18:46:18 -0800 Subject: [PATCH 1/4] wrapping callbacks in process.nextTick - seems to fix #21 --- lib/caching.js | 6 ++++-- lib/multi_caching.js | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/caching.js b/lib/caching.js index 490de42..60ed92e 100644 --- a/lib/caching.js +++ b/lib/caching.js @@ -51,8 +51,10 @@ var caching = function(args) { function fillCallbacks(err, data) { self.queues[key].forEach(function(task) { - var taskDomain = task.domain || domain.create(); - taskDomain.bind(task.cb)(err, data); + process.nextTick(function() { + var taskDomain = task.domain || domain.create(); + taskDomain.bind(task.cb)(err, data); + }); }); delete self.queues[key]; } diff --git a/lib/multi_caching.js b/lib/multi_caching.js index 2719a19..6b6086b 100644 --- a/lib/multi_caching.js +++ b/lib/multi_caching.js @@ -79,8 +79,10 @@ var multi_caching = function(caches) { function fillCallbacks(err, data) { self.queues[key].forEach(function(task) { - var taskDomain = task.domain || domain.create(); - taskDomain.bind(task.cb)(err, data); + process.nextTick(function() { + var taskDomain = task.domain || domain.create(); + taskDomain.bind(task.cb)(err, data); + }); }); delete self.queues[key]; } From 7bd4757bdee6c297ecd2d34f1e02fc40273dfbb4 Mon Sep 17 00:00:00 2001 From: Bryan Donovan Date: Wed, 4 Feb 2015 18:55:33 -0800 Subject: [PATCH 2/4] test case for issue #21 --- test/caching.unit.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/caching.unit.js b/test/caching.unit.js index 7180843..b627474 100644 --- a/test/caching.unit.js +++ b/test/caching.unit.js @@ -327,6 +327,30 @@ describe("caching", function() { }); }); + it("lets us make nested calls", function(done) { + function get_cached_widget(name, cb) { + cache.wrap(key, function(cache_cb) { + methods.get_widget(name, cache_cb); + }, cb); + } + + get_cached_widget(name, function(err, widget) { + check_err(err); + assert.equal(widget.name, name); + + get_cached_widget(name, function(err, widget) { + check_err(err); + assert.equal(widget.name, name); + + get_cached_widget(name, function(err, widget) { + check_err(err); + assert.equal(widget.name, name); + done(); + }); + }); + }); + }); + it("expires cached result after ttl seconds", function(done) { cache.wrap(key, function(cb) { methods.get_widget(name, cb); From d49720560f913300aa5018153fe63d28f9275e70 Mon Sep 17 00:00:00 2001 From: Bryan Donovan Date: Wed, 4 Feb 2015 19:20:40 -0800 Subject: [PATCH 3/4] another test for #21 --- test/multi_caching.unit.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/multi_caching.unit.js b/test/multi_caching.unit.js index 5f93b66..52b7cb1 100644 --- a/test/multi_caching.unit.js +++ b/test/multi_caching.unit.js @@ -519,6 +519,30 @@ describe("multi_caching", function() { }); }); }); + + it("lets us make nested calls", function(done) { + function get_cached_widget(name, cb) { + multi_cache.wrap(key, function(cache_cb) { + methods.get_widget(name, cache_cb); + }, cb); + } + + get_cached_widget(name, function(err, widget) { + check_err(err); + assert.equal(widget.name, name); + + get_cached_widget(name, function(err, widget) { + check_err(err); + assert.equal(widget.name, name); + + get_cached_widget(name, function(err, widget) { + check_err(err); + assert.equal(widget.name, name); + done(); + }); + }); + }); + }); }); context("error handling", function() { From 20092c3505313856190b9f904574090d0bfaf941 Mon Sep 17 00:00:00 2001 From: Bryan Donovan Date: Wed, 4 Feb 2015 20:56:30 -0800 Subject: [PATCH 4/4] better solution for #21. Thanks @aletorrado --- lib/caching.js | 12 ++++++------ lib/multi_caching.js | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/caching.js b/lib/caching.js index 60ed92e..c6e40a5 100644 --- a/lib/caching.js +++ b/lib/caching.js @@ -50,13 +50,13 @@ var caching = function(args) { self.queues[key] = [{cb: cb, domain: process.domain}]; function fillCallbacks(err, data) { - self.queues[key].forEach(function(task) { - process.nextTick(function() { - var taskDomain = task.domain || domain.create(); - taskDomain.bind(task.cb)(err, data); - }); - }); + var waiting = self.queues[key]; delete self.queues[key]; + + waiting.forEach(function(task) { + var taskDomain = task.domain || domain.create(); + taskDomain.bind(task.cb)(err, data); + }); } self.store.get(key, function(err, result) { diff --git a/lib/multi_caching.js b/lib/multi_caching.js index 6b6086b..0bf98de 100644 --- a/lib/multi_caching.js +++ b/lib/multi_caching.js @@ -78,13 +78,13 @@ var multi_caching = function(caches) { self.queues[key] = [{cb: cb, domain: process.domain}]; function fillCallbacks(err, data) { - self.queues[key].forEach(function(task) { - process.nextTick(function() { - var taskDomain = task.domain || domain.create(); - taskDomain.bind(task.cb)(err, data); - }); - }); + var waiting = self.queues[key]; delete self.queues[key]; + + waiting.forEach(function(task) { + var taskDomain = task.domain || domain.create(); + taskDomain.bind(task.cb)(err, data); + }); } get_from_highest_priority_cache(key, function(err, result, index) {