@amg0461

Как выйти из внешней функции?

Есть вот такой код:

const parent = () => {
    // Блок операторов номер 1
    // ...
    // Конец блока номер 1

    fs.readFile(fileName, (err, content) => {
        if (err) {
            // Здесь нужно выйти из функции parent
        }
    })

    // Блок операторов номер 2
    // ...
    // Конец блока номер 2
}
// Блок операторов номер 3
// здесь что-то делаем


То есть имеется некая функция parent, внутри которой есть некий коллбэк (для примера у меня приведено асинхронное чтение файла). Внутри коллбэка есть некое условие, при выполнении которого мне нужно выйти из функции parent, то есть перейти к блоку операторов номер 3. Если я просто напишу return, я выйду из коллбэка, а не из функции parent, то есть перейду к блоку операторов номер 2, а это совсем не то, что мне нужно.

Про промисификацию коллбэков я знаю; это, конечно, решает мою задачу. Но хотелось бы более простое «кондовое» решение без всяких промисов. Выбрасывать исключение я тоже пробовал, такой способ тоже не работает.
  • Вопрос задан
  • 401 просмотр
Решения вопроса 1
@amg0461 Автор вопроса
Хорошо, из обсуждения я понял, что в JavaScript невозможно сразу выйти из внешней функции, находясь во внутренней. Я надеялся, что, может быть, у функции parent есть что-то типа метода parent.return(), который можно вызвать из внутренней функции. Увы... Будем считать, что вопрос закрыт.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
sergiks
@sergiks Куратор тега JavaScript
♬♬
Оберните «блок операторов №3» в функцию. Вызывайте её изнутри if (err)
Ну и в самом parent, если надо.
Ответ написан
@inFureal
В чем проблема выкинуть Error?

const parent = () => {
    // ...
    try {
    fs.readFile(fileName, (err, content) => {
        if (err) {
            throw new Error();
        }
    })
    } catch (e) {
        return;
    }
   // ...
}


Или еще проще

const parent = () => {
    // ...
    let success = true;
    fs.readFile(fileName, (err, content) => {
        if (err) {
            success = false;
            return;
        }
    })

     if (!success) return;
   // ...
}
Ответ написан
axifive
@axifive
Software Engineer
После передачи колбека происходит сразу переход к концу функции (Блок операторов номер 2 в вашем случае), в этом и смысл не блокирующих вызовов.

То есть return не вернет в функцию parent(), а просто завершит выполнение переданной в readFile() анонимной функции.

Можете почитать док, для понимания: Обзор Блокирующих и Неблокирующих Вызовов
Ответ написан
@FKV
Можно использовать метки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы