Javascript Parse.com查询在事实发生后执行

Javascript Parse.com查询在事实发生后执行,javascript,node.js,parse-platform,Javascript,Node.js,Parse Platform,当所有内容都发送到浏览器时,我无法执行listsQuery。我知道我需要一个承诺,但我的尝试到目前为止还没有成功。救命啊 function processNavigation(navigation) { var nav = []; _.each(navigation, function(navItems) { var navProperties = { name: navItems.get("Name"), longName: navItems.get("

当所有内容都发送到浏览器时,我无法执行listsQuery。我知道我需要一个承诺,但我的尝试到目前为止还没有成功。救命啊

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);
}

这应该给你一些东西继续下去,我不确定它是否会工作,但它应该向你展示的概念

您需要做的是创建一个承诺数组,因为它看起来像是您对数组中的每个项目执行查询,并且因为查询需要一些时间,所以在查询完成之前会发送您的响应。然后,您评估一系列承诺,并仅在这些承诺得到解决时才返回您的响应

我建议你把你的逻辑分成几个函数,因为这有点难理解

看一看


我试图使用上面的代码,但它仍然没有停止查询。我修改了代码以移除开关,使其更易于阅读,但仍然没有成功。
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);
        })

    }