Der return
Zweck besteht darin, die Ausführung der Funktion nach der Zurückweisung zu beenden und die Ausführung des Codes danach zu verhindern.
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);
});
}
In diesem Fall wird die resolve(numerator / denominator);
Ausführung verhindert , was nicht unbedingt erforderlich ist. Es ist jedoch weiterhin vorzuziehen, die Ausführung zu beenden, um eine mögliche Falle in der Zukunft zu verhindern. Darüber hinaus empfiehlt es sich, das unnötige Ausführen von Code zu verhindern.
Hintergrund
Ein Versprechen kann in einem von drei Zuständen sein:
- ausstehend - Ausgangszustand. Von ausstehend können wir in einen der anderen Staaten wechseln
- erfüllt - erfolgreicher Betrieb
- abgelehnt - fehlgeschlagener Vorgang
Wenn ein Versprechen erfüllt oder abgelehnt wird, bleibt es auf unbestimmte Zeit in diesem Zustand (erledigt). Die Ablehnung eines erfüllten Versprechens oder die Erfüllung eines abgelehnten Versprechens hat also keine Wirkung.
Dieses Beispiel-Snippet zeigt, dass das Versprechen zwar abgelehnt wurde, aber abgelehnt wurde.
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));
Warum müssen wir also zurückkehren?
Obwohl wir einen festgelegten Versprechungsstatus nicht ändern können, wird die Ausführung des Restes der Funktion durch Ablehnen oder Auflösen nicht gestoppt. Die Funktion kann Code enthalten, der verwirrende Ergebnisse erzeugt. Beispielsweise:
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));
Selbst wenn die Funktion derzeit keinen solchen Code enthält, entsteht eine mögliche zukünftige Falle. Ein zukünftiger Refactor ignoriert möglicherweise die Tatsache, dass der Code nach Ablehnung des Versprechens noch ausgeführt wird und schwer zu debuggen ist.
Beenden der Ausführung nach dem Auflösen / Ablehnen:
Dies ist Standard-JS-Kontrollflussmaterial.
- Rückkehr nach dem
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));
- Rückgabe mit dem
resolve
/ reject
- Da der Rückgabewert des Rückrufs ignoriert wird, können wir eine Zeile speichern, indem wir die Zurückweisungs- / Auflösungsanweisung zurückgeben:
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));
- Verwenden eines if / else-Blocks:
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));
Ich bevorzuge eine der return
Optionen, da der Code flacher ist.