【发布时间】:2016-10-03 17:57:32
【问题描述】:
我有以下 .js 文件,node.js APP 的一部分,以及 2 个问题。
var User = require('../app/models/user');
var Agenda = require('agenda');
var mongoConnectionString = "mongodb://localhost/agenda";
var agenda = new Agenda({db: {address: mongoConnectionString}});
agenda.define('handle energy', function(job, done) {
let lastUpdateRun = new Date(Date.now() - 50*1000); // 50 seconds ago for some buffer room
/****** Energy Loss Per Minute ******/
User.update( // Over 85 -> ~ 40 loss / hour
{'local.energy' : { "$gt" : 85}, "local.energyUpdatedAt": {"$lt": lastUpdateRun}}, // query
{"$inc": { "local.energy": -0.66 }, "local.energyUpdatedAt": new Date() } , // update
{"multi": true}, // Options
function(err, result) { // Callback
if(err) {
console.log(err)
}
}
);
User.update( // Over Under 80 -> ~ 25 loss / hour
{'local.energy' : { "$gt": 50, "$lte" : 85 }, "local.energyUpdatedAt": {"$lt": lastUpdateRun}}, // query
{"$inc": { "local.energy": -0.42 }, "local.energyUpdatedAt": new Date() } , // update
{"multi": true}, // Options
function(err, result) { // Callback
if(err) {
console.log(err)
}
}
);
User.update( // Under 50 -> ~ 15 loss / hour
{'local.energy' : { "$gt": 25, "$lte" : 50}, "local.energyUpdatedAt": {"$lt": lastUpdateRun}}, // query
{"$inc": { "local.energy": -0.25 }, "local.energyUpdatedAt": new Date() }, // update
{"multi": true}, // Options
function(err, result) { // Callback
if(err) {
console.log(err)
}
}
);
User.update( // Under 25 -> ~ 10 loss / hour
{'local.energy' : { "$gt": 10, "$lte" : 25}, "$or" :[{'local.estate.owned.movedIn' : false}, {'local.estate.rented.movedIn' : false}], "local.energyUpdatedAt": {"$lt": lastUpdateRun} }, // query
{"$inc": { "local.energy": -0.167 }, "local.energyUpdatedAt": new Date()} , // update
{"multi": true}, // Options
function(err, result) { // Callback
if(err) {
console.log(err)
}
}
);
/******* Energy Gain Per Minute, No Office *******/
User.update( // Set Energy to Ten if over 9.5 and under 10
{'local.energy' : { "$lt": 10, "$gte" : 9.9}, "$or" : [{'local.estate.movedIn' : false}, {'local.estate.rented.movedIn' : false}], "local.energyUpdatedAt": {"$lt": lastUpdateRun} }, // query
{"$set": { "local.energy": 10 }, "local.energyUpdatedAt": new Date() } , // update
{"multi": true}, // Options
function(err, result) { // Callback
if(err) {
console.log(err)
}
}
);
User.update( // Under 10 -> ~ 5 gain / hour
{'local.energy' : { "$lt": 9.9}, "$or" : [{'local.estate.movedIn' : false}, {'local.estate.rented.movedIn' : false}], "local.energyUpdatedAt": {"$lt": lastUpdateRun} }, // query
{"$inc": { "local.energy": 0.085 }, "local.energyUpdatedAt": new Date() } , // update
{"multi": true}, // Options
function(err, result) { // Callback
if(err) {
console.log(err)
}
}
);
/******* Energy Gain Per Minute, With Office *******/
User.update( // Set Energy to 25 if over 24.5 and under 10
{'local.energy' : { "$lt": 10, "$gte" : 24.5}, "$or" : [{'local.estate.movedIn' : true}, {'local.estate.rented.movedIn' : true}], "local.energyUpdatedAt": {"$lt": lastUpdateRun} }, // query
{"$set": { "local.energy": 10 }, "local.energyUpdatedAt": new Date() } , // update
{"multi": true}, // Options
function(err, result) { // Callback
if(err) {
console.log(err)
}
}
);
User.update( // Under 25 -> ~ 15 gain / hour
{'local.energy' : { "$lt": 24.5 } , "$or" : [{'local.estate.movedIn' : true}, {'local.estate.rented.movedIn' : true}], "local.energyUpdatedAt": {"$lt": lastUpdateRun}}, // query
{"$inc": { "local.energy": 0.250 }, "local.energyUpdatedAt": new Date() } , // update
{"multi": true}, // Options
function(err, result) { // Callback
if(err) {
console.log(err)
}
}
);
done()
});
agenda.on('ready', function() {
agenda.every('one minute', 'handle energy');
agenda.start();
});
// Handle Office Rent Expiration Every Hour
//Handle A Few other things at different times
问题 #1: 有没有更好的方法来处理所有这些更新,我在很短的时间内有很多更新,我一遍又一遍地重复 90% 的代码。在性能方面,这是要走的路还是我犯了一个大错误?
问题 #2: 如果我需要更多计划任务 1 每小时和每 25 分钟一个,我应该为每个任务创建一个 setInterval,因为 iirc javascript 不处理多个 setInterval。那我该怎么处理呢?
附:我还在学习 node/js,所以如果这些都是愚蠢的问题,请不要讨厌我。感谢您的耐心等待。
【问题讨论】:
-
对于安排重复任务,我推荐使用agenda
标签: javascript node.js mongodb scheduled-tasks setinterval