return
Мета полягає в тому, щоб припинити виконання функції після відмови, і запобігти виконанню коду після нього.
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);
});
}
У цьому випадку це запобігає resolve(numerator / denominator);
виконанню, що вкрай не потрібно. Однак все-таки краще припинити виконання, щоб запобігти можливій пастці в майбутньому. Крім того, це непогана практика запобігання виконанню коду без потреби.
Фон
Обіцянка може бути в одному з 3 штатів:
- очікуваний - початковий стан. З очікування ми можемо перейти до одного з інших штатів
- виконано - успішна операція
- відхилено - невдала операція
Коли обіцянка буде виконана або відхилена, вона залишатиметься в такому стані нескінченно (врегульовано). Отже, відхилення виконаної обіцянки або виконання відхиленої обіцянки не матиме ефекту.
Цей приклад прикладу показує, що хоча обіцянка була виконана після її відхилення, вона залишається відхиленою.
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));
То навіщо нам повертатися?
Хоча ми не можемо змінити встановлений стан обіцянки, відхилення або усунення не зупинить виконання решти функції. Функція може містити код, який створить заплутані результати. Наприклад:
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));
Навіть якщо функція не містить такого коду зараз, це створює можливу майбутню пастку. Майбутній рефактор може ігнорувати той факт, що код все ще виконується після відхилення обіцянки, і його буде важко налагодити.
Припинення виконання після вирішення / відхилення:
Це стандартний матеріал управління JS.
- Повернення після
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));
- Повернення з
resolve
/ reject
- оскільки значення повернення зворотного дзвінка ігнорується, ми можемо зберегти рядок, повернувши заяву про відхилення / вирішення:
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));
- Використання блоку 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));
Я вважаю за краще використовувати один із return
варіантів, так як код більш плащ.