Maison  >  Article  >  interface Web  >  async/wait requêtes parallèles et gestion des erreurs

async/wait requêtes parallèles et gestion des erreurs

不言
不言original
2018-07-07 17:57:212450parcourir

Cet article présente principalement les requêtes parallèles async/wait et la gestion des erreurs. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer

séquence asynchrone

. Requêtes simultanées

Lors de l'utilisation asynchrone, il est facile de faire des erreurs dans l'ordre d'exécution du code. Par exemple, si nous voulons lancer deux requêtes en même temps, nous pouvons écrire le code suivant

<.>
function fetchName () {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('lujs')
    }, 3000)
  })
}

function fetchAvatar () {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('https://avatars3.githubusercontent.com/u/16317354?s=88&v=4')
    }, 4000)
  })
}

async fetchUser () {
  const name = await fetchName()
  const avatar = await fetchAvatar()
  return {
    name,
    avatar
  }
}

(async function () {
  console.time('should be 7s ')
  const user = await fetchUser()
  console.log(user)
  console.timeEnd('should be 3s ')
})()
dans ce qui précède Dans le code, nous pensons que fetchName et fetchAvatar seront exécutés en parallèle, mais en fait ils ne le seront pas. fetchAvatar attendra que fetchName soit exécuté avant de lancer la requête. Le temps d'exécution de la fonction fetchUser n'est pas de trois secondes mais de 7 secondes

Si vous souhaitez faire des requêtes parallèles, vous devez écrire comme suit Le temps d'exécution de fetchUserParallel est de 4 secondes

<.>Utilisez Promise.all pour la demande de simultanéité
async function fetchUserParallel () {
  const namePromise = fetchName()
  const avatarPromise = fetchAvatar()
  return {
    name: await namePromise,
    avatar: await avatarPromise 
  }
}
(async function () {
  console.time('should be 3s, but time is ')
  const user = await fetchUser()
  console.log(user)
  console.timeEnd('should be 3s, but time is ')

  console.time('should be 3s : ')
  const user2 = await fetchUserParallel()
  console.log(user2)
  console.timeEnd('should be 3s : ')
})()

Error Get
function fetchList (id) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(`id is : ${id}`)
    }, 5000)
  })
}

async function getList () {
  const ary = [1, 2, 3, 4]
  const list =  Promise.all(
    ary.map(
      (id) => fetchList(id)))
  return await list
}
(async function () {
  // 使用promise并发请求
  console.time('should be 3s ')
  const list = await getList()
  console.log(list)
  console.timeEnd('should be 3s ')
})()

Utilisez try...catch

pour envelopper la promesse afin qu'elle renvoie un résultat unifié format du code
  try {
    const user3 = await fetchUser(true)
  } catch (err) {
    console.error('user3 error:', err)
  }

Article de référence

Continuez à utiliser catch
  /**
   * 包装promise, 使其返回统一的错误格式
   * @param {Promise} promise 
   */
  function to (promise) {
    return promise.then(res => [null, res]).catch(err => [err])
  }
  .
  .
  .
  const [err, res] = await to(fetchUser(true))
  if (err) {
    console.error('touser err:', err)
  }

Si vous êtes intéressé, vous pouvez exécuter le code
  // 因为async 返回的promise对象,所以可以使用catch
  const user4 = await fetchUser(true).catch(err => {
    console.error('user4 error:', err)
  })
Tester le code<.>
Ce qui précède est le contenu complet de l'article, j'espère qu'il sera utile à l'apprentissage de tout le monde. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !
Recommandations associées :

le nœud explore les données de Lagou.com et les exporte sous forme de fichier Excel


Native JS est basé sur la fenêtre. scrollTo() encapsule la fonction de l'outil d'animation à défilement vertical


Similitudes et différences entre les navigateurs et EventLoop de NodeJS et les machines partielles


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn