Le return
but est de terminer l'exécution de la fonction après le rejet et d'empêcher l'exécution du code après celle-ci.
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
reject("Cannot divide by 0");
return; // The function execution ends here
}
resolve(numerator / denominator);
});
}
Dans ce cas, il empêche l' resolve(numerator / denominator);
exécution de ce qui n'est pas strictement nécessaire. Cependant, il est toujours préférable de mettre fin à l'exécution pour éviter un éventuel piège à l'avenir. De plus, c'est une bonne pratique pour éviter d'exécuter du code inutilement.
Contexte
Une promesse peut être dans l'un des 3 états suivants:
- en attente - état initial. De l'attente, nous pouvons passer à l'un des autres États
- réalisé - opération réussie
- rejeté - échec de l'opération
Lorsqu'une promesse est remplie ou rejetée, elle restera indéfiniment dans cet état (réglée). Ainsi, le rejet d'une promesse tenue ou la réalisation d'une promesse rejetée n'auront aucun effet.
Cet exemple d'extrait montre que bien que la promesse ait été tenue après avoir été rejetée, elle est restée rejetée.
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
reject("Cannot divide by 0");
}
resolve(numerator / denominator);
});
}
divide(5,0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
Alors, pourquoi devons-nous revenir?
Bien que nous ne puissions pas changer un état de promesse réglé, le rejet ou la résolution n'arrêtera pas l'exécution du reste de la fonction. La fonction peut contenir du code qui créera des résultats déroutants. Par exemple:
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
reject("Cannot divide by 0");
}
console.log('operation succeeded');
resolve(numerator / denominator);
});
}
divide(5, 0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
Même si la fonction ne contient pas un tel code pour le moment, cela crée un éventuel piège futur. Un futur refactor peut ignorer le fait que le code est toujours exécuté après le rejet de la promesse et sera difficile à déboguer.
Arrêt de l'exécution après résolution / rejet:
Il s'agit de flux de contrôle JS standard.
- Retour après le
resolve
/ reject
:
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
reject("Cannot divide by 0");
return;
}
console.log('operation succeeded');
resolve(numerator / denominator);
});
}
divide(5, 0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
- Retour avec le
resolve
/ reject
- puisque la valeur de retour du rappel est ignorée, nous pouvons enregistrer une ligne en renvoyant l'instruction de rejet / résolution:
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
return reject("Cannot divide by 0");
}
console.log('operation succeeded');
resolve(numerator / denominator);
});
}
divide(5, 0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
- Utilisation d'un bloc if / else:
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
reject("Cannot divide by 0");
} else {
console.log('operation succeeded');
resolve(numerator / denominator);
}
});
}
divide(5, 0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
Je préfère utiliser l'une des return
options car le code est plus plat.