This is a collection of utility functions for working with async/await code.
npm install @kev_nz/async-toolsHere are the functions provided. Additionally feel free to look at the tests in the project as well.
The delay method allows you to use wait a number of milliseconds before continuing the exection of your code.
const { delay } = require('@kev_nz/async-tools')
(async () => {
  await delay(100)
  console.info('~100 milliseconds later')
})()Execute an asynchronous mapping function over an array of returning the result.
const { mapper } = require('@kev_nz/async-tools')
(async () => {
  const items = [1, 2, 3]
  const mappedItems = await mapper(items, anAsynchronousFunction)
  // passing in an additional concurrency value specifies the number of async methods executed at a time
  const mappedItemsAgain = await mapper(items, anAsynchronousFunction, 2)
})()Execute asynchronous reducer functions over a starting value.
const { delay, reducer } = require('@kev_nz/async-tools')
const anAsyncFunction = async val => {
  await delay(10)
  return val + 1
}
(async () => {
  const finalValue = await reducer(0,
    anAsyncFunction,
    anAsyncFunction,
    anAsyncFunction
  )
  //finalValue 3
})()Execute an asynchronous function over an array one item at a time.
const { each } = require('@kev_nz/async-tools')
(async () => {
  const items = [1, 2, 3]
  const [first, second, third] = await each(items, anAsyncFunction)
})()Take number of functions and compose them together.
const { composer } = require('@kev_nz/async-tools')
const anAsyncFunction = async val => {
  await delay(10)
  return val + 1
}
const anotherAsyncFunction = async val => {
  await delay(10)
  return val + 2
}
(async () => {
  const asyncChain = composer(
    anAsyncFunction,
    anotherAsyncFunction,
    anAsyncFunction
  )
  const finalValue = await asyncChain(0)
  //finalValue 4
})()When used with composer it lets you pass additional parameters to a function in the composed.
const { composer, holder } = require('@kev_nz/async-tools')
const anAsyncFunction = async val => {
  await delay(10)
  return val + 1
}
const anotherAsyncFunction = async (val, secondValue) => {
  await delay(10)
  return val + secondValue
}
(async () => {
  const asyncChain = composer(
    anAsyncFunction,
    holder(anotherAsyncFunction, 3),
    anAsyncFunction
  )
  const finalValue = await asyncChain(0)
  //finalValue 5
})()Take number of functions and compose them together.
const { timeout } = require('@kev_nz/async-tools')
(async () => {
  const result = await timeout(() => thingThatIsLongRunning())
})()Execute an async function while a condition is true
const { doWhile } = require('@kev_nz/async-tools')
(async () => {
  const results = await doWhile(async () => {
    await asyncFunction()
  }, () => something === true)
})()While a condition is true execute an async function
const { whileDo } = require('@kev_nz/async-tools')
(async () => {
  const results = await whileDo(
    () => something === true),
    async () => {
      await asyncFunction()
    })
})()