I have to write a javaScript function that return some data to the caller.
In that function I have multiple ways to retrieve data i.e.,
Personally, I would try the three asynchronous retrievals sequentially, starting with the least expensive and ending with the most expensive. However, responding to the first of three parallel retrievals is an interesting problem.
You should be able to exploit the characteristic of $q.all(promises)
, by which :
But you want to invert the logic such that :
This should be achievable with an invert()
utility which converts success to failure and vice versa.
function invert(promise) {
return promise.then(function(x) {
return $q.defer().reject(x).promise;
}, function(x) {
return $q.defer().resolve(x).promise;
});
}
And a first()
utility, to give the desired behaviour :
function first(arr) {
return invert($q.all(arr.map(invert)));
}
Notes:
arr
is an array of promisesarray.map()
is assumed (otherwise you can explicitly loop to achieve the same effect)invert()
in first()
restores the correct sense of the promise it returnsThen getOrder()
will be something like this :
function getOrder(id) {
return first([
cache.get(id),
localStorage.get(id).then(cache.put),
backend.get(id).then(cache.put).then(localStorage.put)
]);
}
Thus, getOrder(id)
should return a Promise of an order (not the order directly).