Say, I have a function F1 that will be called in many other function. F1 is meant to return a value VAL that will be used in F2. A promise is needed to retrieve that needed data that will help calculate VAL. Having F1 as a promise would cause a lot of confusion in F2, for F1 is often called inside IF statements and FOR loops. Let me illustrate this scenario:
function F1(param1, param2) {
    var VAL = 0;
    promise(param1, param2).then(function(data) {
        for (var i = 0; i < data.length; i++) {
            // Do some calculation here
        }
    });
    return VAL;
}
function F2(x1, x2) {
    var myArray = [],
        someValue = 0;
    if ([conditional expression]) {
        someValue = F1(x1, x2);
        call_some_function();
        myArray.push({
          val: someValue,
          ...
        });
    }
    var x = someValue + y;
    myArray.push({
        id: x,
        ...
    });
    return myArray;
}
How do I make sure that F1 returns VAL (integer) so I can use it as a synchronous function?
Thanks in advance for your help.
EDIT:
Here is how the code looks like:
    function myFunc(x, y) {
        return init()
            .then(function() {
                return getData(x, y).then(function(data) {
                    if (data.length == 0) return [];
                    var id, name, 
                        firstPass = true,
                        headIn = 0, 
                        headOut = 0, 
                        currentHead = 0,
                        payWtIn = 0,
                        payWtOut = 0,
                        expectedAdg = 0,
                        weight = 0,
                        results = [];
                    for (var i = 0; i < data.length; i++) {
                        if (firstPass) {
                            id = data[i].id();
                            name = data[i].name();
                            headIn = data[i].headIn();
                            headOut = data[i].headOut();
                            expectedAdg = data[i].expectedAdg();
                            firstPass = false;
                        }
                        if (id != data[i].id()) {
                            buildFunc();
                            reset();
                        }
                        headIn += data[i].headIn();
                        headOut += data[i].headOut();
                        payWtIn += data[i].payWtIn();
                        payWtOut += data[i].payWtOut();
                    }
                    buildFunc();
                    return results;
                    function buildFunc() {
                        currentHead = headIn - headOut;
                        var headDays = getHeadDays({ locationId: locationId, groupId: groupId, callDate: null });
                        var totalWeight = headIn != 0
                            ? ((((headDays * expectedAdg) + payWtIn) / headIn) * currentHead) + payWtOut
                            : 0;
                        results.push({
                            id: id,
                            name: name,
                            headIn: headIn,
                            headOut: headOut,
                            headDays: headDays,
                            currentHd: currentHead,
                            totalWt: totalWeight
                        });
                    }
                    function reset() {
                        id = data[i].id();
                        name = data[i].name();
                        headIn = data[i].headIn();
                        headOut = data[i].headOut();
                        expectedAdg = data[i].expectedAdg();
                        payWtIn = 0;
                        payWtOut = 0;
                        weight = 0;
                    }
                });
            });
    }
function getHeadDays(params) {
    var VAL = 0;
    promise(params.a, params.b).then(function(data) {
        for (var i = 0; i < data.length; i++) {
            // Make calculation to determine VAL here                           
        }
    });
    return VAL;
}
The init function loads needed entities in the cache (I'm working with BreezeJs) for querying. The getData function gets raw data that are sorted by id from database, and those data are used to determine the results array. As the data are looped through, as long as the id of each record is the same, headIn, headOut, payWtIn and payWtOut are incremented by the record fields, and when the previous and current id are different, we can calculate totalWeight and push a new record to the results array with the buildFunc function. Inside that buildFunc function, we retrieve the headDays in order to calculate totalWeight. The getHeadDays function will be called in many other functions. Please, let me know if you have any questions. Thanks in advance for your help.
 
    