У меня есть такое действие:
export const loginUser = ({ email, password }) => {
return (dispatch) => {
dispatch({ type: LOGIN_USER });
firebase.auth().signInWithEmailAndPassword(email, password)
.then(user => {
const { currentUser } = firebase.auth();
firebase.database().ref(`users/${currentUser.uid}/userInfo`)
.on('value', snapshot => {
const userInfo = _.map(snapshot.val(), (val, uid) => {
return { ...val, uid };
});
console.info(userInfo);
dispatch({ type: USERINFO_FETCHED, payload: userInfo });
});
Actions.main();
dispatch({
type: LOGIN_USER_SUCCESS,
payload: user
});
})
.catch(() => {
dispatch({
type: LOGIN_USER_FAIL,
});
});
};
};Эти функции выполняются неупорядоченно, потому что это асинхронные функции. Хорошо, мы все это знаем. Я хочу привести в порядок эти функции. Прежде всего, я хочу запустить и закончить эти коды:
const { currentUser } = firebase.auth();
firebase.database().ref(`users/${currentUser.uid}/userInfo`)
.on('value', snapshot => {
const userInfo = _.map(snapshot.val(), (val, uid) => {
return { ...val, uid };
});
console.info(userInfo);
dispatch({ type: USERINFO_FETCHED, payload: userInfo });и после их завершения я хочу запустить эту строку:
Actions.main();Это возможно? Я не мог этого сделать. Спасибо за ваши ответы...



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно научиться использовать промисы. Ниже приведен хороший учебник по последовательному выполнению промисов. Заключите свои методы в промисы и запустите их Promise.all.
https://decembersoft.com/posts/promises-in-serial-with-array-reduce/
Легко исправить, попробовав что-то вроде Actions.main(); этого внутри .on('value'.
export const loginUser = ({ email, password }) => {
return (dispatch) => {
dispatch({ type: LOGIN_USER });
firebase.auth().signInWithEmailAndPassword(email, password)
.then(user => {
const { currentUser } = firebase.auth();
firebase.database().ref(`users/${currentUser.uid}/userInfo`)
.on('value', snapshot => {
const userInfo = _.map(snapshot.val(), (val, uid) => {
return { ...val, uid };
});
console.info(userInfo);
dispatch({ type: USERINFO_FETCHED, payload: userInfo });
Actions.main();
});
dispatch({
type: LOGIN_USER_SUCCESS,
payload: user
});
})
.catch(() => {
dispatch({
type: LOGIN_USER_FAIL,
});
});
};
};
Ааа так просто, моя вина.. Спасибо