#javascript
#javascript
Вопрос:
Есть ли способ, которым я могу выйти из родительской функции, находясь внутри дочерней функции этого родителя? Что-то вроде того, как дочерний цикл может выйти из родительского цикла с break
ключевым словом, к которому присоединен суффикс имени родительского цикла like parent: loop
.
function parent() {
function child() {
return child;
}
child()
console.log("I don't want this code to be run")
}
parent();
console.log("Just printing this means I escaped parent function (from child function)");
Комментарии:
1.
return child()
?
Ответ №1:
Вы можете сделать это с помощью if
инструкции. Если возвращаемое значение child
равно true, родительская функция немедленно завершается
function parent() {
function child() {
return true //I want to exit parent function from here
}
if (child()) {
return;
}
console.log("still inside parent")
}
parent();
console.log("outside parent");
Ответ №2:
Вы можете сделать что-то подобное:
function parent() {
quit = false
function child() {
quit = true
return //I want to exit parent function from here
}
child()
if (quit) {
return
}
console.log("still inside parent")
}
parent();
console.log("outside parent");
Ответ №3:
Есть ли способ, которым я могу выйти из родительской функции, находясь внутри дочерней функции этого родителя?
Нет, вы не можете заставить родительскую функцию возвращаться из дочерней функции.
С учетом сказанного, один из способов решить эту проблему — вернуть значение из, child()
которое parent()
может использовать:
function parent() {
function child() {
return true;
}
if(child())
console.log("still inside parent")
}
Это похоже на то, как взаимодействуют любые две функции, даже если они не вложены.
Комментарии:
1. Уничтожено. Я понимаю, почему это было бы сложнее, чем выход из вложенного цикла — функции должны возвращать что-то, чего не делают циклы. Тем не менее, была бы отличная функциональность, если бы она просто возвращала родительскую функцию
undefined
или что-то в этом роде.
Ответ №4:
Почему бы не использовать функцию обратного вызова в качестве дочерней?
function parent(child) {
// Do parent stuff
return child()
console.log("You'll never reach here.")
}
// Call the parent and do the parent stuff first.
parent(function() {
// Do child stuff.
return
})
console.log("You'll be here after running parent followed by child.");
Используйте подход Promise:
function parent() {
return new Promise( (resolve, reject) => {
try {
// Do parent stuff.
resolve(function() {
// Do child stuff.
return true
})
}
catch (error) {
return reject(error)
}
});
// You'll never reach here.
}
// Call the parent.
parent()
.then((isChildDone) => {
if (isChildDone) {
console.log("You'll be here after running parent followed by child.");
}
})
.catch((error) => {
// Handle error if child hit error.
});