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
-, поскольку возвращаемое значение обратного вызова игнорируется, мы можем сохранить строку, вернув оператор reject / resol:
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
вариантов, так как код более плоский.