簡體   English   中英

貓鼬查找結果和異步

[英]Mongoose Find Results and Async

我正在編寫一個NodeJS腳本,該腳本將通過Heroku的調度程序每小時運行一次。 我正在查詢我擁有的Mongo實例(mongohq / compose),然后對這些結果進行處理。 我正在使用Mongoose.js和find()命令。 這將返回結果數組。 對於這些結果,我需要執行其他查詢以及一些其他異步處理(發送電子郵件等)。

長話短說,由於節點的異步特性,我需要等到所有處理完成后再調用process.exit() 如果我不這樣做,則腳本會提前停止,並且不會處理整個結果集。

問題是我在這一點上有一個聖誕樹效果(5個嵌套的asnyc調用)。

通常,我會使用async.js庫解決此問題,但通過這么多的回調方法卻無法解決這個問題。

如何在退出腳本之前確保整個過程完成?

這是我正在使用的代碼(注意:下面還將lodash用作_ ):

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

        _.forEach(topics, function (topic, callback) {

            User.findById(topic.user, function (err, user) {
                if (err) {
                    // TODO: impl logging
                    console.error(err);
                } else {

                    // Create a new moment object (not moment.js, an actual moment mongoose obj)
                    var m = new Moment({ name: moment().format("MMM Do YY"), topic: topic});
                    m.save(function(err) {
                        if(err) {
                            // TODO: impl logging
                            console.error(err);
                        } else {

                            // Send an email via postmark
                            sendReminderTo(topic, user, m._id);

                            // Update the topic with next notification times.
                            // .. update some topic fields/etc
                            topic.save(function (err) {
                                if(err) {
                                    console.error(err);
                                } else {
                                    console.log("Topic updated.");
                                }
                            })
                        }
                    })
                }
            });
            console.log("User: " + topic.user);
        });
    }
});

使代碼混亂的部分原因是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();
    });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM