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