Javascript Mongoose查找结果和异步

Javascript Mongoose查找结果和异步,javascript,node.js,asynchronous,mongoose,Javascript,Node.js,Asynchronous,Mongoose,我正在编写一个NodeJS脚本,它将通过Heroku的调度程序每小时运行一次。我正在查询我拥有的Mongo实例(mongohq/compose),然后用这些结果做一些事情。我正在使用Mongoose.js和find()命令。这将返回一个结果数组。有了这些结果,我需要执行额外的查询以及一些额外的异步处理(发送电子邮件等) 长话短说,由于节点的异步性质,我需要等到所有处理完成后再调用process.exit()。如果不这样做,脚本将提前停止,并且不会处理整个结果集 问题是我在这一点上有一个调用的圣诞

我正在编写一个NodeJS脚本,它将通过Heroku的调度程序每小时运行一次。我正在查询我拥有的Mongo实例(mongohq/compose),然后用这些结果做一些事情。我正在使用Mongoose.js和find()命令。这将返回一个结果数组。有了这些结果,我需要执行额外的查询以及一些额外的异步处理(发送电子邮件等)

长话短说,由于节点的异步性质,我需要等到所有处理完成后再调用
process.exit()
。如果不这样做,脚本将提前停止,并且不会处理整个结果集

问题是我在这一点上有一个调用的圣诞树效应(5个嵌套的asnyc调用)

通常我会用async.js库来解决这个问题,但是我在这么多回调中遇到了一个问题

如何确保在退出脚本之前完成整个过程

下面是我正在使用的代码(注意:下面也使用lodash作为
\uuuu
):


使代码混乱的部分原因是
else
语句的使用。如果返回错误,则不需要else语句,并为每个回调保存4行缩进。这本身将使事情变得更具可读性

使用异步:

Topic.find({nextNotificationDate: {$lte: moment().utc()}}, function (err, topics) {
    if (err) {
        console.error(err);
        return finish(err);
    }

    async.each(topics, function(topic, topicCallback) {

        async.auto({

            user: function (callback) {

                User.findById(topic.user, callback);
            },

            moment: function(callback) {

                var m = new Moment({name: moment().format("MMM Do YY"), topic: topic});
                m.save(callback);
            },

            topic: ["moment", "user", function (callback, results) {

                var m = results.moment;
                var user = results.user;

                sendReminderTo(topic, user, m._id);
                topic.save(callback);
            }]

        }, function(err) {
            if (err) {
                return topicCallback(err);
            }

            console.log("Topic updated.")
            return topicCallback();
        });
    }, function(err) {
        if (err) {
            console.error(err);
            return finish(err);
        }

        return finish();
    });
});

“呼叫的圣诞树效应”(aka)是如何使“流程在退出前未完成”的?或者它们是两个独立的问题?或多或少只是帮助理解问题。地狱让我想得太多/不明白如何解决它。很好。非常感谢。然而,我追求的最终结果是如何执行所有操作,然后在完成后,知道何时调用process.exit()。:)@托尼——这正是我想要的,但我不确定这是否对我有用。
Topic.find({nextNotificationDate: {$lte: moment().utc()}}, function (err, topics) {
    if (err) {
        console.error(err);
        return finish(err);
    }

    async.each(topics, function(topic, topicCallback) {

        async.auto({

            user: function (callback) {

                User.findById(topic.user, callback);
            },

            moment: function(callback) {

                var m = new Moment({name: moment().format("MMM Do YY"), topic: topic});
                m.save(callback);
            },

            topic: ["moment", "user", function (callback, results) {

                var m = results.moment;
                var user = results.user;

                sendReminderTo(topic, user, m._id);
                topic.save(callback);
            }]

        }, function(err) {
            if (err) {
                return topicCallback(err);
            }

            console.log("Topic updated.")
            return topicCallback();
        });
    }, function(err) {
        if (err) {
            console.error(err);
            return finish(err);
        }

        return finish();
    });
});