How to excecute asyncronous promise used Promise.All()?

M ilham :

I want to ask, how do you run ascyronus promises in the promise all? when I run the function that I made Promise.all runs all the functions in parallel (syncronus)

if you run the code below then the result is

// jon
// andrey
// tania
// JON
// ANDREY
// TANIA

here is my code

// First promise returns an array
const getUsers = () => {
  return new Promise((resolve, reject) => {
    return setTimeout(() => resolve([{ id: 'jon' }, { id: 'andrey' }, { id: 'tania' }]), 600)
  })
}

// Second promise relies on the resulting array of first promise
const getIdFromUser = users => {
  return new Promise((resolve, reject) => {
    return setTimeout(() => resolve(users.id), 500)
  })
}

// Third promise relies on the result of the second promise
const capitalizeIds = id => {
  return new Promise((resolve, reject) => {
    return setTimeout(() => resolve(id.toUpperCase()), 200)
  })
}

const newPromise = async user => {
      const userId = await getIdFromUser(user)
      console.log(userId) //jon
      const capitalizedId = await capitalizeIds(userId)
      console.log(capitalizedId) //JON
      return
  }

const runAsyncFunctions = async () => {
  const users = await getUsers()

  await  Promise.all(users.map(user => newPromise(user)))
}

runAsyncFunctions()

but I want the results as below, this will work if the promise all is run asyncronus

// jon
// JON
// andrey
// ANDREY
// tania
// TANIA

and this is my playgorund code https://repl.it/repls/CalculatingAwfulComputerscience

CertainPerformance :

If you want to initialize a Promise only after the last Promise has finished - that is, run them in serial, not in parallel - then .map and Promise.all is not the right tool for the job, because that'll initialize all Promises at once. await in a for loop instead:

const runAsyncFunctions = async() => {
  const users = await getUsers()
  for (const user of users) {
    await newPromise(user);
  }
}

// First promise returns an array
const getUsers = () => {
  return new Promise((resolve, reject) => {
    return setTimeout(() => resolve([{
      id: 'jon'
    }, {
      id: 'andrey'
    }, {
      id: 'tania'
    }]), 600)
  })
}

// Second promise relies on the resulting array of first promise
const getIdFromUser = users => {
  return new Promise((resolve, reject) => {
    return setTimeout(() => resolve(users.id), 500)
  })
}

// Third promise relies on the result of the second promise
const capitalizeIds = id => {
  return new Promise((resolve, reject) => {
    return setTimeout(() => resolve(id.toUpperCase()), 200)
  })
}

const newPromise = async user => {
  const userId = await getIdFromUser(user)
  console.log(userId) //jon
  const capitalizedId = await capitalizeIds(userId)
  console.log(capitalizedId) //JON
  return
}

const runAsyncFunctions = async() => {
  const users = await getUsers()
  for (const user of users) {
    await newPromise(user);
  }
}

runAsyncFunctions()

If your real code allows you to do the logging outside, you can keep running the Promises in parallel, but only log the results in order once they're all completed:

const newPromise = async user => {
  const userId = await getIdFromUser(user)
  const capitalizedId = await capitalizeIds(userId)
  return [userId, capitalizedId];
}
const runAsyncFunctions = async() => {
  const users = await getUsers()

  const names = await Promise.all(users.map(user => newPromise(user)));
  for (const name of names.flat()) {
    console.log(name);
  }
}

// First promise returns an array
const getUsers = () => {
  return new Promise((resolve, reject) => {
    return setTimeout(() => resolve([{
      id: 'jon'
    }, {
      id: 'andrey'
    }, {
      id: 'tania'
    }]), 600)
  })
}

// Second promise relies on the resulting array of first promise
const getIdFromUser = users => {
  return new Promise((resolve, reject) => {
    return setTimeout(() => resolve(users.id), 500)
  })
}

// Third promise relies on the result of the second promise
const capitalizeIds = id => {
  return new Promise((resolve, reject) => {
    return setTimeout(() => resolve(id.toUpperCase()), 200)
  })
}

const newPromise = async user => {
  const userId = await getIdFromUser(user)
  const capitalizedId = await capitalizeIds(userId)
  return [userId, capitalizedId];
}

const runAsyncFunctions = async() => {
  const users = await getUsers()

  const names = await Promise.all(users.map(user => newPromise(user)));
  for (const name of names.flat()) {
    console.log(name);
  }
}

runAsyncFunctions()

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=319761&siteId=1