I'm wondering what the best approach might be.
One approach is to chain cachedPromise
and "regular", thus, if cachedPromise
fails, we call a regular one (and caching results).
The second is to have a wrapper function, something like a decorator in python, and being able to wrap any promise-returning function when needed.
Here's code illustrating both approaches:
// this is for node.js environment
// in modern browsers Promise is already implemented
// as a standard feature
var Promise = require('bluebird');
var cachedPromise = {
_cache: {},
get: function(key) {
var isCached = this._cache.hasOwnProperty(key);
var data = this._cache[key];
return new Promise(function(resolve, reject) {
isCached ? resolve(data) : reject();
});
},
store: function(key, value) {
this._cache[key] = value;
}
}
var WrappedPromise = function(promiseFunc) {
var cache = {};
return function(key) {
if (cache.hasOwnProperty(key)) {
return Promise.cast(cache[key]);
} else {
var promise = promiseFunc(key);
return promise.then(function(data) {
cache[key] = data;
return promise;
});
}
}
}
var mockRequestPromise = function(name){
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve({'name': name});
}, 1000);
});
}
var requestChained = function(name) {
return cachedPromise.get(name).catch(function() {
var promise = mockRequestPromise(name);
return promise.then(function(data) {
cachedPromise.store(name, data);
return promise;
})
});
}
var requestWrapped = WrappedPromise(mockRequestPromise);
If you have any considerations regarding this issue, I will be much obliged.