async库是npm上一个处理异步操作的超级库,可以实现很多异步操作和流程控制。虽然我们可以使用Promise或async/await语法来实现一些简单的异步控制,但是对于异步进程很多的情况,我们会很难处理。本文主要介绍async在node环境下如何配合mongoose实现数据库分页以及async配合mongoose查询连续n天的每日数据。安装asyncnpmiasync官方文档asyn的两个API引入了parallel(tasks,callback)并行运行函数的任务集合,无需等待前一个函数完成。如果任一函数将错误传递给其回调,则立即使用错误值调用主回调。任务完成后,结果将作为数组或对象传递给最终回调。示例:async.parallel({一个:function(callback){setTimeout(function(){callback(null,1);},200);},二:function(callback){setTimeout(function(){callback(null,2);},100);}},function(err,results){//结果现在等于:{one:1,two:2}});series(tasks,callback)按顺序运行任务集合中的函数,每个任务在前一个函数完成后运行。如果系列中的任何函数将错误传递给其回调,则不会运行其他函数,并且会立即使用错误值调用回调。否则,当任务完成时,回调将收到一组结果。也可以使用对象而不是数组。每个属性都将作为函数运行,结果将作为对象而不是数组传递给最终回调。这是处理async.series结果的更具可读性的方法。示例:async.series({一个:function(callback){setTimeout(function(){callback(null,1);},200);},二:function(callback){setTimeout(function(){callback(null,2);},100);}},function(err,results){//结果现在等于:{one:1,two:2}});知道了上面两个关键的API,我们就可以来完成一些功能的应用了。分页constmongoose=require('mongoose')constasync=require('async')/**pagination*page,pageSize,Model,populate='',queryParams={},sortParams*@param{*}options*/exports.queryPagination=(options={},callback)=>{let{page,pageSize,Model,populate='',queryParams={},sortParams,field=''}=optionsletstart=(page-1)*pageSizelet$page={pageNumber:page}async.parallel({count:function(cb){Model.countDocuments(queryParams).exec(cb)},data:function(cb){Model.find(queryParams).skip(start).limit(pageSize).populate(populate).sort(sortParams).select(field).exec(cb)}},function(err,results){letcount=results.count$page.count=复制代码count$page.pageTotal=Math.ceil(count/pageSize)$page.data=results.datacallback(err,$page)})}查询连续n天的每日数据查询最近7天以访问趋势为例/***7天访问趋势*/exports.dayViewsController=(req,res)=>{//获取最近7天的日期constdays=get7day()//对象参数constofasync.seriesparallelQuerys={}days.forEach((day)=>{letstartDate=newDate(day).getTime()letlastDate=newDate(moment(startDate).add(1,'days').format('YYYY-MM-DD')).getTime()parallelQuerys[String(day)]=function(cb){Vistor.countDocuments({browse_time_stamp:{$gte:startDate,$lt:lastDate,},}).exec(cb)}})async.series(parallelQuerys,function(err,results){if(err){responseError({err,res})}else{responseSuccess({res,data:results})}})}总结:对于异步编程模型来说,在同步编程中很容易做的事情现在变得很麻烦。async的流程控制大大简化了很多复杂的操作,使用async库编写数据库的查询流程变得异常简单
