Окей, добавьте некоторые улучшения в мой код, но все еще есть проблемы с подписками. Теперь все окейно, но когда я выхожу и авторизируюсь, функции getProducts () и updateBudget () не отписываются.
Код здесь: index. js:
//get the products and render
const unsubscribe = products.getProducts((data, id) => {
console.log(data, id);
productUI.render(data, id);
}, user.uid);
callbacks.push(unsubscribe);
//update budget + form
const handleBudgetFormSubmit = e => {
e.preventDefault();
//update budget
const budget = Number(budgetForm.budget_value.value.trim());
sumStats.addStatsUI('', '');
products.updateBudget(budget, user.uid);
//reset form
budgetForm.reset();
const budgetCart = document.querySelector('#budget');
budgetCart.classList.remove('active');
// show message
updateMssg.innerText = `Your budget was updated to ${budget}$`;
updateMssg.classList.add('act');
setTimeout(() => {
updateMssg.innerText = '';
updateMssg.classList.remove('act');
}, 3000);
};
budgetForm.addEventListener('submit', handleBudgetFormSubmit);
callbacks.push(() =>
budgetForm.removeEventListener('submit', handleBudgetFormSubmit)
);
и другие для onAuthStateChanged () -> if (user):
} else {
console.log('user logged out');
authUI('');
productUI.render('');
sumStats.addStatsUI('');
console.log('Callbacks array', callbacks);
callbacks.forEach(callback => callback());
callbacks.length = 0;
}});
getProducts () и updateBudget ():
getProducts(callback, user) {
//download list from firebase
this.products
.doc(user)
.collection('products')
.orderBy('created_at', 'desc')
.onSnapshot(snapshot => {
snapshot.docChanges().forEach(change => {
if (change.type === 'added') {
//udpate UI
return callback(change.doc.data(), change.doc.id);
}
});
});
}
updateBudget(budget, user) {
console.log('budget', budget, user);
const db = firebase.firestore();
// this.budget = budget;
db.collection('users')
.doc(user)
.update({ budget: budget });
}
Когда я выхожу и захожу:
Когда у меня есть getProducts и добавить товар в коллекцию, эта функция визуализирует (render ()) товар дважды, но добавляет в коллекцию один раз. Когда я обновляю бюджет, этот возвратный бюджет, но после этого, возвращает 0 (в DOM, где показывать бюджет a можно увидеть «Бесконечность»)
И еще одна вещь, когда я выхожу из системы, ошибка возврата консоли:
TypeError: callback is not a function
at eval (index.js:182)
at Array.forEach (<anonymous>)
at Object.eval [as next] (index.js:182)
at eval (index.cjs.js:1226)
at eval (index.cjs.js:1336)
Я думаю, это потому, что getProducts и updateBudget не возвращают отписку, но не определены.
Может быть, у кого-то есть решение для этого?