Wait for all promises to resolve

angular-promise, angularjs, promise

Solution

I want the all to resolve when all the chains have been resolved.

Sure, then just pass the promise of each chain into the `all()` instead of the initial promises:

$q.all([one.promise, two.promise, three.promise]).then(function() {
    console.log("ALL INITIAL PROMISES RESOLVED");
});

var onechain   = one.promise.then(success).then(success),
    twochain   = two.promise.then(success),
    threechain = three.promise.then(success).then(success).then(success);

$q.all([onechain, twochain, threechain]).then(function() {
    console.log("ALL PROMISES RESOLVED");
});

Problem

So I have a situation where I have multiple promise chains of an unknown length. I want some action to run when all the CHAINS have been processed. Is that even possible? Here is an example: ``` 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); }); ``` In this example, I set up a `$q.all()` for promises one, two, and three which will get resolved at some random time. I then add promises onto the ends of one and three. I want the `all` to resolve when all the chains have been resolved. Here is the output when I run this code: ``` one done one doneChained two done three done ALL PROMISES RESOLVED three doneChained three doneChainedChained ``` Is there a way to wait for the chains to resolve?

Original source