143 votes

Différence entre `return wait promise` et` return promise`

Étant donné les exemples de code ci-dessous, il y a une différence dans le comportement, et, dans l'affirmative, quelles sont ces différences?

return await promise

async function delay1Second() {
  return (await delay(1000));
}

return promise

async function delay1Second() {
  return delay(1000);
}

Si je comprends bien, la première serait de gestion des erreurs à l'intérieur de la fonction async, et les erreurs bulle de l'asynchrone en fonction de la Promesse. Cependant, la deuxième nécessiterait un de moins de tiques. Est-ce correct?

Cet extrait est seulement commun de la fonction de retour d'une Promesse de référence.

function delay(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

200voto

denisw Points 948

La plupart du temps, il n'y a pas de différence observable entre return et return await. Les deux versions de l' delay1Second ont exactement les mêmes comportements observables (mais en fonction de la mise en œuvre, l' return await version pourrait utiliser un peu plus de mémoire car un intermédiaire Promise objet peut être créé).

Cependant, comme @PitaJ souligné, il existe un cas où il y a une différence: si l' return ou return await est imbriquée dans une try-catch bloc. Considérons cet exemple

async function rejectionWithReturnAwait () {
  try {
    return await Promise.reject(new Error())
  } catch (e) {
    return 'Saved!'
  }
}

async function rejectionWithReturn () {
  try {
    return Promise.reject(new Error())
  } catch (e) {
    return 'Saved!'
  }
}

Dans la première version, la fonction async attend rejeté la promesse, avant de retourner son résultat, ce qui provoque le rejet à être transformé en une exception et l' catch clause puisse être atteint; la fonction va donc revenir une promesse que la résolution de la chaîne de caractères "Salut!".

La deuxième version de la fonction, cependant, n'retour rejeté la promesse directement sans attendre dans la fonction async, ce qui signifie que l' catch de cas n'est pas appelé et de l'appelant obtient le rejet de la place.

3voto

nrabinowitz Points 27991

C'est une question difficile à répondre, car il dépend en pratique de la façon dont votre transpiler (probablement en babel) génère async/await. Les choses sont claires, peu importe:

  • Les deux implémentations devraient se comporter de la même, bien que la première mise en œuvre peut avoir un de moins Promise dans la chaîne.

  • Surtout si vous déposez les inutiles await, la deuxième version ne nécessite aucun code supplémentaire de la transpiler, tandis que le premier.

Donc, à partir d'un code de la performance et de la perspective débogage, la deuxième version est préférable, bien que très légèrement, de sorte, alors que la première version possède un léger avantage de la lisibilité, en ce qu'il indique clairement qu'il renvoie une promesse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X