asyncronous約束をexcecuteする方法)(Promise.Allを使用?

Mのイルハム:

私はあなたがすべての約束でascyronusの約束を実行するのですか、お聞きしたいですか?私はPromise.allはパラレル(syncronus)のすべての機能を実行したことの関数を実行すると

あなたは以下のコードを実行した場合、結果はあります

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

ここに私のコードです

// 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()

しかし、私はすべて実行されasyncronusを約束した場合の結果は以下のように、これは動作しますしたいです

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

これは私のplaygorundコードですhttps://repl.it/repls/CalculatingAwfulComputerscience

CertainPerformance:

あなたが最後の約束が終了した後にのみ約束を初期化したい場合は-であること、でそれらを実行して、シリアル、その後-並列で、ない.mapPromise.allそれが一度にすべての約束を初期化しますので、仕事のための適切なツールではありません。ループの代わりに:awaitfor

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()

あなたの本当のコードがロギングを行うことを可能にする場合は外側を、あなたは、並行して約束を実行し続けることができますが、それらは全て完了していたらだけ、その結果を順にログインします。

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()

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=320662&siteId=1