使用async解决nodejs异步问题

参考文档: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;
			});
		});
	});
};

                            


转载于:https://my.oschina.net/chinacaptain/blog/467455

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值