Parse.com query executing after the fact

I am having trouble with listsQuery not executing by the time everything gets sent to the browser. I know I need a Promise or something in there, but my attempts are so far unsuccessful. Help!

function processNavigation(navigation) {
var nav = [];
_.each(navigation, function(navItems) {
    var navProperties = {
        name: navItems.get("Name"),
        longName: navItems.get("LongName"),
        icon: navItems.get("Icon"),
        url: navItems.get("Url"),
        module: navItems.get("Module"),
        runScript: navItems.get("RunScript"),
        sortOrder: navItems.get("SortOrder")
    };

    switch (navItems.get("Module")) {
        case "lists":
            var listsQuery = new Parse.Query("ListItems"); // This should return back! But it's async? Needs promise?
            listsQuery.ascending("SortOrder");
            listsQuery.find().then(
                function(results) {
                    var list = [];
                    _.each(results, function(listItems) {
                        var listProperties = {
                            name: listItems.get("Name"),
                            subName: listItems.get("Subname"),
                            sortOrder: listItems.get("SortOrder")
                        };
                    });
                    list.push(listProperties);
                    navProperties["source"] = list;
                },
                function() {
                    res.send('error');
                }
            );  
            break;

        default:
            navProperties["source"] = null;
            break;
    }

    nav.push(navProperties);
});

res.send(nav);
}

This should give you something to go on, im not sure if it will work but it should show you the concept.

What you need to do is create an array of promises as it looks like your performing a query for each item in an array, and because the queries take some time your response is sent before the queries are complete. You then evaluate the array of promises and send your response back only when they are resolved.

I would suggest you split your logic into a few more functions as it's a little hard to follow.

Take a look at the parallel promises section

function processNavigation(navigation) {
    var nav = [];
    var promises = []

        _.each(navigation, function(navItems) {
            var navProperties = {
                name: navItems.get("Name"),
                longName: navItems.get("LongName"),
                icon: navItems.get("Icon"),
                url: navItems.get("Url"),
                module: navItems.get("Module"),
                runScript: navItems.get("RunScript"),
                sortOrder: navItems.get("SortOrder")
            };

            switch (navItems.get("Module")) {
                case "lists":
                    promises.push((function(navProperties){
                        var listsQuery = new Parse.Query("ListItems"); // This should return back! But it's async? Needs promise?
                        listsQuery.ascending("SortOrder");
                        listsQuery.find().then(
                            function(results) {
                                var list = [];
                                _.each(results, function(listItems) {
                                    var listProperties = {
                                        name: listItems.get("Name"),
                                        subName: listItems.get("Subname"),
                                        sortOrder: listItems.get("SortOrder")
                                    };
                                });
                                list.push(listProperties);
                                navProperties["source"] = list;
                                promise.resolve();
                            },
                            function() {
                                promise.reject();
                                res.send('error');
                            }
                        );
                    })(navProperties))

                    break;

                default:
                    navProperties["source"] = null;
                    break;
            }

            nav.push(navProperties);
        });


        Parse.Promise.when(promises).then(function(){                               
            res.send(nav);
        })

    }