Espera a que se resuelvan todas las promesas

Así que tengo una situación en la que tengo múltiples cadenas de promesa de una longitud desconocida. Quiero que se ejecute alguna acción cuando se hayan procesado todas las CADENAS. ¿Es eso posible? Aquí hay un ejemplo:

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);
});

En este ejemplo, configuré un$q.all() para las promesas uno, dos y tres que se resolverán en algún momento aleatorio. Luego agrego promesas en los extremos de uno y tres. Quiero elall resolver cuando se hayan resuelto todas las cadenas. Aquí está el resultado cuando ejecuto este código:

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

¿Hay alguna forma de esperar a que se resuelvan las cadenas?

Respuestas a la pregunta(5)

Su respuesta a la pregunta