all files / modules/ AsyncUtils.js

85.29% Statements 29/34
66.67% Branches 8/12
100% Functions 7/7
84.38% Lines 27/32
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 295×   295× 295×     493×     493× 431×   62×       295×     86× 86×   86×     86×   168×     168×       168×   168×   168× 86×       86× 168× 168×          
export function loopAsync(turns, work, callback) {
  let currentTurn = 0, isDone = false
 
  function done() {
    isDone = true
    callback.apply(this, arguments)
  }
 
  function next() {
    Iif (isDone)
      return
 
    if (currentTurn < turns) {
      work.call(this, currentTurn++, next, done)
    } else {
      done.apply(this, arguments)
    }
  }
 
  next()
}
 
export function mapAsync(array, work, callback) {
  const length = array.length
  const values = []
 
  Iif (length === 0)
    return callback(null, values)
 
  let isDone = false, doneCount = 0
 
  function done(index, error, value) {
    Iif (isDone)
      return
 
    Iif (error) {
      isDone = true
      callback(error)
    } else {
      values[index] = value
 
      isDone = (++doneCount === length)
 
      if (isDone)
        callback(null, values)
    }
  }
 
  array.forEach(function (item, index) {
    work(item, index, function (error, value) {
      done(index, error, value)
    })
  })
}