diff --git a/lib/caching.js b/lib/caching.js index a956e30..38319b5 100644 --- a/lib/caching.js +++ b/lib/caching.js @@ -40,38 +40,37 @@ var caching = function (args) { ttl = undefined; } + if (self.queues[key]) { + self.queues[key].push(cb); + return; + } + + self.queues[key] = [cb]; + + function fillCallbacks(err, data){ + self.queues[key].forEach(function(f){ + f(err, data); + }); + delete self.queues[key]; + } + self.store.get(key, function (err, result) { if (err && (!self.ignoreCacheErrors)) { - cb(err); + fillCallbacks(err); } else if (result) { - cb.call(cb, null, result); - } else if (self.queues[key]) { - self.queues[key].push(cb); + fillCallbacks(null, result); } else { - self.queues[key] = [cb]; - - work(function () { - var work_args = Array.prototype.slice.call(arguments, 0); - if (work_args[0]) { // assume first arg is an error - self.queues[key].forEach(function (done) { - done.call(null, work_args[0]); - }); - delete self.queues[key]; + work(function (err, data) { + if (err) { + fillCallbacks(err); return; } - // Subsequently assume second arg is result. - self.store.set(key, work_args[1], ttl, function (err) { + self.store.set(key, data, ttl, function (err) { if (err && (!self.ignoreCacheErrors)) { - self.queues[key].forEach(function (done) { - done.call(null, err); - }); + fillCallbacks(err); } else { - self.queues[key].forEach(function (done) { - done.apply(null, work_args); - }); + fillCallbacks(err, data); } - - delete self.queues[key]; }); }); } diff --git a/lib/multi_caching.js b/lib/multi_caching.js index 2dc52e7..9e9b328 100644 --- a/lib/multi_caching.js +++ b/lib/multi_caching.js @@ -47,9 +47,23 @@ var multi_caching = function (caches) { ttl = undefined; } + if (self.queues[key]) { + self.queues[key].push(cb); + return; + } + + self.queues[key] = [cb]; + + function fillCallbacks(err, data){ + self.queues[key].forEach(function(f){ + f(err, data); + }); + delete self.queues[key]; + } + get_from_highest_priority_cache(key, function (err, result, index) { if (err) { - return cb(err); + return fillCallbacks(err); } else if (result) { var caches_to_update = caches.slice(0, index); var opts = { @@ -58,38 +72,21 @@ var multi_caching = function (caches) { ttl: ttl }; set_in_multiple_caches(caches_to_update, opts, function (err) { - cb(err, result); + fillCallbacks(err, result); }); - } else if (self.queues[key]) { - self.queues[key].push(cb); } else { - self.queues[key] = [cb]; - work(function () { - var work_args = Array.prototype.slice.call(arguments, 0); - if (work_args[0]) { // assume first arg is an error - self.queues[key].forEach(function (done) { - done.call(null, work_args[0]); - }); - delete self.queues[key]; + work(function (err, data) { + if (err) { + fillCallbacks(err, data); return; } var opts = { key: key, - value: work_args[1], + value: data, ttl: ttl }; set_in_multiple_caches(caches, opts, function (err) { - if (err) { - self.queues[key].forEach(function (done) { - done.call(null, err); - }); - delete self.queues[key]; - return; - } - self.queues[key].forEach(function (done) { - done.apply(null, work_args); - }); - delete self.queues[key]; + fillCallbacks(null, data); }); }); }