JSFiddle - React, Tailwind, and code Playground

JavaScript

var dfd1 = $.Deferred();
var dfd2 = $.Deferred();

setTimeout(function() {
    console.log('Resolve dfd2');
    dfd2.resolve('Hi!');
}, 200);

setTimeout(function() {
    console.log('Fail dfd1');
    dfd1.reject('Damn!');
}, 100);

$.whenAllDone = function() {
    var deferreds = [];
    var result = $.Deferred();
    
    $.each(arguments, function(i, current) {
        var currentDeferred = $.Deferred();
        current.then(function() {
            currentDeferred.resolve(false, arguments);
        }, function() {
            currentDeferred.resolve(true, arguments);
        });
        deferreds.push(currentDeferred);
    });
    
    $.when.apply($, deferreds).then(function() {
        var failures = [];
        var successes = [];
        
        $.each(arguments, function(i, args) {
            // If we resolved with `true` as the first parameter
            // we have a failure, a success otherwise
            var target = args[0] ? failures : successes;
            var data = args[1];
            // Push either all arguments or the only one
            target.push(data.length === 1 ? data[0] : args);
        });
        
        if(failures.length) {
            return result.reject.apply(result, failures);
        }
        
        return result.resolve.apply(result, successes);
    });
    
    return result;
}

$.whenAllDone(dfd1, dfd2).then(function() {
    console.log('Done', arguments);
}, function() {
    console.log('Failed', arguments);
});