Aguarde todas as promessas resolverem

Então, eu tenho uma situação em que tenho várias cadeias de promessas de comprimento desconhecido. Quero que alguma ação seja executada quando todas as cadeias tiverem sido processadas. É mesmo possível? Aqui está um exemplo:

app.controller('MainCtrl', function($scope, $q, $timeout) {
    var one = $q.defer();
    var two = $q.defer();
    var three = $q.defer();

    var all = $q.all([one.promise, two.promise, three.promise]);
    all.then(allSuccess);

    function success(data) {
        console.log(data);
        return data + "Chained";
    }

    function allSuccess(){
        console.log("ALL PROMISES RESOLVED")
    }

    one.promise.then(success).then(success);
    two.promise.then(success);
    three.promise.then(success).then(success).then(success);

    $timeout(function () {
        one.resolve("one done");
    }, Math.random() * 1000);

    $timeout(function () {
        two.resolve("two done");
    }, Math.random() * 1000);

    $timeout(function () {
        three.resolve("three done");
    }, Math.random() * 1000);
});

Neste exemplo, configurei um$q.all() pelas promessas um, dois e três, que serão resolvidas em algum momento aleatório. Depois adiciono promessas nas extremidades de um e três. eu quero oall resolver quando todas as cadeias foram resolvidas. Aqui está a saída quando executo este código:

one done 
one doneChained
two done
three done
ALL PROMISES RESOLVED
three doneChained
three doneChainedChained 

Existe uma maneira de esperar que as cadeias resolvam?

questionAnswers(5)

yourAnswerToTheQuestion