Цель 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);
, что не является строго необходимым. Однако все же предпочтительнее прекратить выполнение, чтобы предотвратить возможную ловушку в будущем. Кроме того, рекомендуется предотвращать ненужный запуск кода.
Фон
Обещание может находиться в одном из трех состояний:
- в ожидании - исходное состояние. Из состояния ожидания мы можем перейти в одно из других состояний
- выполнено - успешная операция
- отклонено - операция завершилась неудачно
Когда обещание выполнено или отклонено, оно будет оставаться в этом состоянии на неопределенный срок (урегулировано). Таким образом, отклонение выполненного обещания или выполнение отклоненного обещания не будет иметь никакого эффекта.
Этот фрагмент примера показывает, что, хотя обещание было выполнено после отклонения, оно осталось отклоненным.
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 / resolve:
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
, так как код более плоский.
person
Ori Drori
schedule
12.09.2015