Поясните за коллбек без параметра
у меня вопрос на счет коллбеков. Как работает коллбек без параметров? Учусь по книге Node js в действии(2018 года), в ней приводятся примеры кода с комментариями. Как видите, в каждом статическом методе последним аргументом является cb. Я вроде как понял что коллбек это функция, которая вызовется когда отработает весь остальной код. Но в контексте данного кода это определение не совсем понятно. Особенно в местах, где просто вызывается cb(). Сразу скажу, что скинул не весь код, но в других местах коллбек не объявлен. Поэтому в общем-то я и не понимаю что он и зачем. Если бы было что-то вроде:
var cb = function(){
//экспекто патронум = призвать оленя()
}
То вопросов не возникло бы, а так... Вот код из учебника чтобы лучше понять вопрос Комментарии из него же, в скобках указываю что непонятно.
static getByName(name, cb){
User.getId(name, (err, id)=>{ //Определяет идентификатор пользователя по имени
if(err) return cb(err)
User.getByName(id, cb) //Получает данные пользователя по идентификатору (что здесь делает cb?)
})
}
static getId(name, cb){
db.get(`user:id${name}`, cb) //Получает идентификатор индексированием по имени (и здесь?)
}
static get(id, cb){
db.hgetall(`user:${id}`, (err, user)=>{ //получает данные в виде простого объекта
if(err) return cb(err) //(cb(err) я так понимаю работает как new Error?)
cb(null, new User(user)) //Преобразует простой объект в новый объект User
})
}
static authenticate (name, pass, cb){
User.getByName(name, (err, user)=>{ //Проводит поиск пользователя по имени
if(err) return cb(err)
if(!user.id) return cb() //Пользователь не существует (и здесь?)
bcrypt.hash(pass, user.salt, (err, hash)=>{ //Хэширует введенный пароль
if(err) return cb(err)
if(hash === user.pass) return cb(null, user) //Обнаружено совпадение
cb() //Неверный пароль (Неверный пароль ок, а cb() что делает?
})
})
}
Ответы (1 шт):
Эти методы получают какие-то данные. Получать-то получают, но использовать полученные данные как-то нужно потом. Если метод асинхронный, то данные доступны не сразу, поэтому применяются коллбэки. То, что они указаны без круглых вызывающих скобок, означает, что вместо них будет какая-то реальная функция, заданная вами. То есть в данном случае cb - это ссылка на какую-то функцию (в будущем вашу). Далее cb вызывается с аргументами или без. Это обычное дело, и есть соглашение в ноде насчёт аргумента err (всегда первого по порядку). Когда имеется err, значит ошибка, когда его нет, то можно смело продолжать в вашей функции что-то делать.
Теперь ваши вопросы по порядку:
что здесь делает cb?
Он будет вызван после того, как User.getByName получит данные, и в этот колбэк вторым аргументом забросит эти данные (скорее всего), так как первый аргумент всегда зарезервирован для ошибки (err).
и здесь?
Да, то же самое по сути.
cb(err) я так понимаю работает как new Error?
Нет. Ошибка уже имеется к данному моменту и она просто помещается в первый аргумент функции по нодовскому соглашению.
Неверный пароль (Неверный пароль ок, а cb() что делает?
Вызывается без объекта юзера, соответсвенно вы должны его в своей функции проверять. Однако тут спорный момент, не понятно почему в данном случае там не сделана ошибка cb( Error('user not found') ) или подобная.
Вызывать эти методы можно так:
User.getByName( 'Vasia', ( err, user )=>{
if( err || !user ) return; // прерываем свои действия
.... // а тут пишем действия если всё норм
});