北在北方

太白枝头看,花开不计年,杯中浮日月,楼外是青天。

导航

避免多层回调,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)