Skip to content

Instantly share code, notes, and snippets.

@tistre
Last active August 29, 2015 14:04
Show Gist options
  • Save tistre/575ef1f0220097c7a585 to your computer and use it in GitHub Desktop.
Save tistre/575ef1f0220097c7a585 to your computer and use it in GitHub Desktop.
jQuery.Deferred(): If an array contains promises, replace them with the real value once resolved
// Usage:
// resolvePromisesInArray(values_with_promises).then(function(values_resolved)
// { console.log(values_resolved); });
function resolvePromisesInArray(values)
{
var deferred, deferred_values;
if (! $.isArray(values))
{
return values;
}
// Check which of the values are promises to return the real value later
deferred_values = [ ];
$.each(values, function(i, value)
{
var deferred_value;
if ($.type(value) !== 'object')
{
return;
}
if (! $.isFunction(value.promise))
{
return;
}
deferred_value = $.Deferred();
deferred_values.push(deferred_value);
// When a promise is fulfilled, replace it with the real value
value.then(function(real_value)
{
values[ i ] = real_value;
deferred_value.resolve();
});
});
// Return a promise: Will provide the values array once all real values have arrived
deferred = $.Deferred();
$.when.apply($, deferred_values).done(function()
{
deferred.resolve(values);
});
return deferred.promise();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment