避免多层回调,Node.js异步库Async使用(series)
Posted on 2014-06-27 16:29 CN.programmer.Luxh 阅读(837) 评论(0) 编辑 收藏 举报未使用Async之前coffeescript写的代码:
exports.product_file_add = (req,res) -> if !req.param('file_id') return res.json({'flag':'error','msg':'请先上传文件再保存!'}) file_type = req.param('file_type') #判断产品和文件类型,限制上传的数量 params = {} params.product_code = req.param('product_code') params.file_type = file_type ProductFile.count params,(err,count) -> if count>0 return res.json({'flag':'error','msg':'该产品的文件已存在!'}) product_file = new ProductFile product_file.add req,(err)-> if err resErr(res,err) else res.json({'flag':'success'})
使用Async之后coffeescript写的代码:
exports.product_file_add = (req,res) -> if !req.param('file_id') return res.json({'flag':'error','msg':'请先上传文件再保存!'}) async.series([ (cb)-> #判断产品和文件类型,限制上传的数量 params = {} params.product_code = req.param('product_code') params.file_type = file_type ProductFile.count params,(err,count) -> if count>0 cb('该产品的文件已存在!') else cb(null) (cb)-> product_file = new ProductFile product_file.add req,(err)-> if err cb(err) else cb(null) ], (err,results)-> if err return res.json({'flag':'error','msg':err}) res.json({'flag':'success'}) )
当然这里的代码嵌套不深,不太能看不进出使用Async的好处。
Async.series,串行执行每一个异步回调的函数
依次执行一个函数数组中的每个函数,每一个函数执行完成之后才能执行下一个函数。
如果任何一个函数向它的回调函数中传了一个error,则后面的函数都不会被执行,并且将会立刻会将该error以及已经执行了的函数的结果,传给series中最后那个callback。
当所有的函数执行完后(没有出错),则会把每个函数传给其回调函数的结果合并为一个数组,传给series最后的那个callback。
还可以json的形式来提供tasks。每一个属性都会被当作函数来执行,并且结果也会以json形式传给series最后的那个callback。这种方式可读性更高一些。这段话来源于(http://www.verydemo.com/demo_c441_i206465.html)