Поскольку процесс входа в систему требует умеренного количества кода, рассмотрите возможность помещения его в свою собственную автономную функцию, которая возвращает Promise
.Сделайте то же самое для добавления пользователя, и тогда вы можете использовать single .catch
в конце, если есть ошибка, возвращая все Обещания, чтобы они были правильно соединены воедино, избегая обещанияанти-шаблон обратного вызова:
FirebaseHelper.getDataFromDB("users", profileSort.email )
.then(({ exists }) => (
exists
? updateData()
: addUser()
))
.then((profileSort) => {
done(null, profileSort);
})
.catch((err) => {
done(err);
});
function updateData() {
return FirebaseHelper.updateDataInDb("authentication", profileSort.email, TokenToStore)
//User signs in, check if we have tokens for meetup, eventbrite
.then(() => {
return FirebaseHelper.getDataFromDB("authenticat", profileSort.email);
})
.then(response => {
//if yes, store them in session
if (response.exists) {
req.session.contextToken = response.data();
if (req.session.contextToken.meetupAccessToken) {
profileSort.meetup = true;
profileSort.eventbrite = true;
}
//Replace the token with currret store token
req.session.contextToken = {...req.session.contextToken, ...TokenToStore}
}
return profileSort;
});
}
function addUser() {
//adding user and storing authentication information
return FirebaseHelper.setDataToDb("users", profileSort.email, profileSort)
.then(() => {
return FirebaseHelper.setDataToDb("authentication", profileSort.email, TokenToStore)
})
.then(() => profileSort);
return done(null, profileSort)
}
Было бы даже лучше, если бы содержащая функция возвращала Promise
вместо принятия обратного вызова done
- с обещаниями работать гораздо лучше, чем с обратными вызовами,в конце концов:
function doStuff() {
return FirebaseHelper.getDataFromDB("users", profileSort.email )
.then(({ exists }) => (
exists
? updateData()
: addUser()
));
// ...
Тогда вместо
doStuff((err, profileSort) => {
// ...
вы можете сделать
doStuff()
.then((profileSort) => {
// handle success
})
.catch((err) => {
// handle errors
})
, используя async
/ await
вместо .then
s может сделать код еще короче, хотя не знаю, поддерживает ли это ваша среда.