Почему return не прерывает исполнение forEach у массива?

Тестировал авторизацию и наткнулся на такое чудо, что в функции находится массив и его перебор (forEach). В переборе предусмотрен поиск и в лог действительно пишется, что что-то найдено. Там стоит return, который, по-идее, должен завершить выполнение функции, но выполняется ещё и код после перебора.

Вот сама функция:
Код функции

async search(login) {
        fs.readFile(`${__dirname}/data/users.json`, (err, data) => {
            if(err) return false

            // Convert to JSON
            let parsed = JSON.parse(data.toString())

            // If user found, return functions. If not - true (data is correct, but user not exists)
            parsed.forEach((user, i) => {
                console.log('Parsing users. Index', i, 'Data:', user)
                console.log(`${user.auth.login} = ${login},`, user.auth.login === login)
                if(user.auth.login === login) {
                    console.log('All ok')
                    return {
                        validPassword: password => {
                            return user.auth.password === argon.hash(crypt.decrypt(password, 'smthkey').toString()).toString()
                        },
                        getProfile: () => {
                            return user.profile
                        },
                        getID: () => {
                            return user.id
                        }
                    }
                }
            })

            console.log('Nothing is found')
            return true
        })
    }



Вот, что уходит в лог:
Лог

TyLoDesu = TyLoDesu, true
All ok
Nothing is found
  • Вопрос задан
  • 1163 просмотра
Решения вопроса 2
yarkov
@yarkov Куратор тега JavaScript
Помог ответ? Отметь решением.
Там стоит return, который, по-идее, должен завершить выполнение функции

С фига ли это?
Примечание: Не существует способа остановить или прервать цикл forEach() кроме как выбрасыванием исключения. Если вам необходимо такое поведение, метод forEach() неправильный выбор.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
return срабатывает и возвращает управление из анонимной функции в основной цикл forEach, после чего forEach работает дальше.
Используйте .find
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
scottparker
@scottparker
это ретурны для стрелочных функций, например этой
password => {
  return user.auth.password===argon.hash(crypt.decrypt(password, 'smthkey').toString()).toString()
}
Ответ написан
Комментировать
@Nc_Soft
Пачка замечаний по коду
1. Если уж используется async, то почему не использовать fs-promises ?
const fs = require('fs').promises
2. Зачем делать data.toString(), если можно указать кодировку и сразу вернется строка, а не буфер?
fs.readFile(file, 'utf-8')
3. всю эту простыню можно переписать на обычный find
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы