Skip to content

for await

iterating asynchronously

js
const asyncIterator = {
  next: () => {
    if (index >= array.length)
      return Promise.resolve({ done: true })
    return Promise.resolve({ value: array[index++], done: false })
  }
}

const asyncIterable = {
  [Symbol.asyncIterator]: () => asyncIterator
}

async function iterate() {
  for await (const num of asyncIterable) console.log(num)
}
const asyncIterator = {
  next: () => {
    if (index >= array.length)
      return Promise.resolve({ done: true })
    return Promise.resolve({ value: array[index++], done: false })
  }
}

const asyncIterable = {
  [Symbol.asyncIterator]: () => asyncIterator
}

async function iterate() {
  for await (const num of asyncIterable) console.log(num)
}

async generators

ts
async function * asyncIteratorGenerator<T extends Array<any>>(paramsList: T[], asyncFunc: (...params: T) => Promise<any>) {
  let i = 0
  while (true) {
    const res = await asyncFunc(...paramsList[i])
    yield await res
    i++
  }
}
async function * asyncIteratorGenerator<T extends Array<any>>(paramsList: T[], asyncFunc: (...params: T) => Promise<any>) {
  let i = 0
  while (true) {
    const res = await asyncFunc(...paramsList[i])
    yield await res
    i++
  }
}
ts
async function delayExecute(delay: number) {
  return await new Promise((resolve) => {
    setTimeout(() => {
      resolve(delay)
    }, delay)
  })
}

it('through all in order', async () => {
  let i = 0
  const paramsList: [number][] = [[600], [500], [400]]
  for await (const res of asyncIteratorGenerator(paramsList, delayExecute)) {
    expect(res).toBe(paramsList[i][0])
    i++
    if (i >= 3)
      break
  }
})
async function delayExecute(delay: number) {
  return await new Promise((resolve) => {
    setTimeout(() => {
      resolve(delay)
    }, delay)
  })
}

it('through all in order', async () => {
  let i = 0
  const paramsList: [number][] = [[600], [500], [400]]
  for await (const res of asyncIteratorGenerator(paramsList, delayExecute)) {
    expect(res).toBe(paramsList[i][0])
    i++
    if (i >= 3)
      break
  }
})