So I was asked this at an interview, but it brought up a good use case. Assume that you have a bunch of data sources. You want to find the first available one and process it and ignore the rest.
So something like:
var datasources = new Array("somedatabase1/pizza","somedatabase2/beer","somedatabase3/llama");
var dfds = new Array();
$.each(datasources,function(source){
dfds.push($.getJSON(source));
});
$.when(dfds).done(function(){alert("they are all done");});
Ignore that I really don't think when accepts an array (maybe it does). This of course would make it wait till they are all completed. I am looking for some code that would make it wait until one, any of them is done, and then not worry about the others.
I was informed that it would only work recursively.
This doesn't use recursion but fits the requirement to fetch from multiple datasources and only care about the first that returns a successful response.
http://jsfiddle.net/mNJ6D/
function raceToIt(urls) {
var deferred = $.Deferred(),
promises;
function anyComplete(data) {
if (!deferred.isResolved()) {
deferred.resolveWith(this, [data]);
promises.forEach(function(promise) {
promise.abort();
});
}
}
promises = urls.map(function(url) {
return $.getJSON(url).then(anyComplete);
});
return deferred.promise();
}
raceToIt(["/echo/json/", "/echo/json/", "/echo/json/"]).then(function(data) {
console.log(data);
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With