参考文档:http://blog.fens.me/nodejs-async/
项目要求:1.对用户的煤、水、电的使用金额对用户进行每周短信提醒。
2.当爬虫爬来的煤、水、电的剩余金额小于10元时,对用户进行短信提醒。
数据库描诉:mongodb 建了4张表 分别分 每周提醒表、水费表、电费表、煤气表
每周提醒表:用户名、用户id、是否开/关提醒功能、用户是否关联煤、水、电、用户电话
电费表:用户名、用户id、社区编号、供电公司编号、是否开/关提醒、剩余电费、用户电话、更新时间、上次更新时间、上次更新剩余电费、
遇到问题描诉:使用nodejs开发,实现每周六晚上短信提醒用户功能。
通过每周提醒表得到用户的信息、根据信息判断用户是否有煤水电关联,如果关联去对应的煤水电的表里查询,然后将查询信息拼接成新的数据结构返回回来。
由于nodejs访问数据库的是异步请求得到数据不完整。所以使用async模块。
解决办法:
var scheduleObj = require('node-schedule');
var mongoWake = require('./mongo/wakeSaturday');
var mongoElectric = require('./mongo/mongoElectric');
var mongoWater = require('./mongo/mongoWater');
var mongoGas = require('./mongo/mongoGas');
//引用async模块
var async = require('async');
exports.schedule = function(){
var rule = new scheduleObj.RecurrenceRule();
var times = [];
for(var i=1; i<60; i=i+10){
times.push(i);
}
//每周6
rule.dayOfWeek =6;
//服务器上使用的是什么时间 是格林尼治时间 还是中国时间
rule.hour =22;
rule.second = 0;
var j = scheduleObj.scheduleJob(rule, function(){
//从周提醒的表里取出课题性的用户信息
mongoWake.getAll(function(err,result){
// console.log(result);
if(err){
return console.log(err);
}
//把信息添加到mapseries里需要控制流程逐一接下来的查询
async.mapSeries(result,function(item,callbackMap){
item.result={};
// item.result['electric'] = 10;
// item.result['water'] = 30;
// item.result['gas'] = 60;
// callbackMap(null,item);
//需要对查询的信息逐条判断,判断用户是否于煤水电进行关联,并寻要在每张表查询完返回的结果加入最后的result里
async.waterfall([searchElectric, searchWater, searchGas], function(){
callbackMap(null, item);
});
function searchElectric(done){
if(item.types.electric){
console.log('electric balance');
mongoElectric.findById(item.userId,function(err,eleResult){
// console.log(eleResult[0]);
// obj.push(eleResult[0]);
item.result['electric'] = eleResult[0];
done();
});
}else{
done();
}
};
function searchWater(done){
if(item.types.water){
console.log('water balance');
mongoWater.findById(item.userId,function(err,waterResult){
item.result['water'] = waterResult[0];
done();
});
}else{
done();
}
};
function searchGas(done){
if(item.types.gas){
console.log('gas balance');
mongoGas.findById(item.userId,function(err,gasResult){
item.result['gas'] = gasResult[0];
done();
});
}else{
done();
}
};
},function(err, results){
console.log(results);
return results;
});
});
});
};