I'm using Parse Cloud functions for mobile apps, but all of them follow asynchronous nature. Hence to overcome that nature, I started using javascript Promises. But promises also not giving me the desired output.
The problem is : second-then is executed after the third-then. And in third-then the parameter of getRecommendedGroup groups is getting []
getRecommendedGroup(request.params.email, groups, function(data){
    this is a callback
});
Basically groups is an output of 2nd then.
So how should I write my code inorder to make 2nd-then execute before 3rd-then. 
Below is the code snippet
Parse.Cloud.define("getGroup", function(request, response) {
            var grpMember = new Parse.Query("GroupMember"),
                groupIds = [],
                groupObj = {};
            grpMember.equalTo("user", request.params.email);
            //from the groupMember we're taking groupId  
            grpMember.find()
                .then(function(grpMemberResponse) {
                    grpMemberResponse.forEach(function(value, index) {
                        var memberObj = value;
                        groupIds.push(memberObj.get("groupId").id);
                    });
                    return groupIds;
                })
                //with this groupId we're retriving group and pushing it to an groupArr
                .then(function(groupIds) {
                        var groupArr = [];
                        var promises = [];
                        groupIds.forEach(function(value, index) {
                                alert("GroupId :: " + value);
                                promises.push(findGroup(value, function(group) {
                                        groupArr.push(group);
                                    });
                                });
                            return Parse.Promise.when(promises);
                        })
                    .then(function(groups) {
                        alert("GroupArr :: " + JSON.stringify(groups));
                        getRecommendedGroup(request.params.email, groups, function(data) {
                            groupObj["own"] = groups;
                            groupObj["recommended"] = data;
                            response.success(groupObj);
                        });
                    });
                });
var findGroup = function(objectId, callback) {
    var groupQuery = new Parse.Query("Group");
    groupQuery.get(objectId, {
        success: function(group) {
            alert("Group Obj Id ::" + group.id);
            callback(group);
        },
        error: function(error) {
            alert("Error while finding Group " + error);
        }
    });
};
 
    