Есть ли способ, которым я могу выйти из родительской функции, находясь внутри дочерней функции этого родителя?

#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.
   });