JSFiddle - React, Tailwind, and code Playground

HTML

Items remaining: <span id="msg"></span>

JavaScript

(function ($) {
    $.whenAlways = function (chain) {
        if (!chain || !$.isArray(chain)) chain = $.extend([], arguments);
        var n = chain.length;
        return $.Deferred(function (deferred) {
            $.each(chain, function (i, promise) {
                if (!promise.always) n--;
                else {
                    promise.always(function () {
                        deferred.notify(--n);
                        if (n == 0) deferred.resolve();
                    });
                }
            });
            if (n == 0) deferred.resolve();
        }).promise();
    }
})(jQuery);

function makePromise(t) {
    return $.Deferred(function (dfrd) {
        setTimeout(dfrd.resolve, t);
    }).promise();
}

var pArr = [
    makePromise(4000),
    makePromise(2000),
    makePromise(1000),
    makePromise(5000),
    makePromise(3000)
];

$("#msg").text(pArr.length);

$.whenAlways(pArr).progress(function (n) {
    $("#msg").text(n);
}).done(function() {
    $("#msg").text('zero');
});