My Program Structure is Like this
 function a(){
    b().then(function(res){
    })
    f().then(function(res){
    })
    }
    and then function c(){
    d().then(function(res){
    });
    e().then(function(res){
    })
    };
    function b(){
    //async operation
    }
    function f(){
    //async operation
    }
    function e(){
    //async operation
    }
    function d(){
    //async operation
    }
What i want to achieve is that when every function inside b is done , then c must start working , So Basically I need a little help in structuring my program but i cannot change much of my inside function as I have written a lot of them and it's working with timeout but I know it's a very poor workaround but if you can suggest how to do it with minimal modification it would be helpful and even if I have to modify it what will be the best approach to do so ? , So I can prevent mistakes in future.
I finally solved the problem by making proper use of promise.push and then resolving all the promises in $q.all(promise)
function a() {
    var deferred = $q.defer();
    deferred.resolve('a')
    return deferred.promise;
}
function b() {
    var deferred = $q.defer();
    deferred.resolve('b')
    return deferred.promise;
}
function a() {
    var deferred = $q.defer();
    deferred.resolve('a')
    return deferred.promise;
}
function b() {
    var deferred = $q.defer();
    deferred.resolve('b')
    return deferred.promise;
}
function g() {
    var deferred = $q.defer();
    deferred.resolve('a')
    return deferred.promise;
}
function h() {
    var deferred = $q.defer();
    deferred.resolve('b')
    return deferred.promise;
}
function c() {
    var deferred = $q.defer();
    var promise = [];
    promise.push(a().then(function(res) {
        return res
    }));
    promise.push(b().then(function(res) {
        return res;
    })) $q.all(promise).then(function(res) {
        deferred.resolve(res);
    }) return deferred.promise;
}
function e() {
    var deferred = $q.defer();
    var promise = [];
    promise.push(g().then(function(res) {
        return res
    })) promise.push(h().then(function(res) {
        return res;
    })) $q.all(promise).then(function(res) {
        deferred.resolve(res);
    }) return deferred.promise;
}
function final() {
    var deferred = $q.defer();
    var promise = [];
    promise.push(c().then(function(res) {
        return res
    })) promise.push(e().then(function(res) {
        return res;
    })) $q.all(promise).then(function(res) {
        deferred.resolve(res);
    }) return deferred.promise;
}
final().then(function(res) {
    console.log('move next')
})