Как пропустить первоначальный запуск «child_added» слушателя в firebase-web? - PullRequest
0 голосов
/ 22 марта 2019

У меня есть компонент в реакции, который должен загружать исходные данные с помощью некоторых функций, вызываемых внутри, который отправляет данные для редукции из других частей базы данных.Позвонив по номеру once, я получу свой список и все мои данные настроены.Но я хочу выслушать изменения в списке, но без функций извлечения данных инициализации внутри.Это выглядит так:

const Component = ({
    projectId,
    setId,

    getSet
}) => {
    useEffect(() => {
        if (setId) {
            getSet(projectId, setId);
        }
    }, [setId]);
    //...
    
    //...
const getClassesForElements = (projectId, elements, callback) => {

    if (projectId && Array.isArray(elements)) {
        
        const elementsClasses = elements.reduce(
            async (classes, elementId) => {

                const className = await elementsDb
                .child(`${projectId}/${elementId}`)
                .once("value", snap => snap.val());

                classes[elementId] = className;
                return classes;
            },
        {});
        
        callback && callback(elementsClasses);
        return elementsClasses;
    }
};

const getClassesAttributes = (projectId, classes, callback) => {

    if (projectId && Array.isArray(classes)) {
        const classesAttributes = classes.reduce(
            async (classes, classId) => {

                const attributes = await classesDb
                .child(`${projectId}/${classId}`)
                .once("value", snap => snap.val());

                classes[classId] = attributes;
                return classes;
            },
        {});
        
        callback && callback(classesAttributes);
        return classesAttributes;
    }
};

export const getSet = (
    projectId,
    setId
) => (
    async dispatch => (
        projectId && setId &&
        setsDb
        .child(`${projectId}/${setId}`)
        .once("value", async snap => {

            const set = await snap.val();
            dispatch(setSet(set));

            const elements = Object.keys(set);
            
            //get data from other parts of the database
            const elementsClasses = await getClassesForElements(projectId, elements);
            dispatch(setElements(elementsClasses));

            const classes = Object.values(elementsClasses);
            
            //get data from other parts of the database
            const classesAttributes = await getClassesAttributes(projectId, classes);
            dispatch(setClasses(classesAttributes));
        })
    )
);

Так что getClassesForElements и getClassesAttributes можно вызвать только один раз, кроме случаев, когда setId был изменен.Я думал о том, чтобы как-то реализовать child_added вместо once, но он будет вызывать getClassesForElements и getClassesAttributes каждый раз, когда добавляется ребенок.Я также думал о перемещении getClassesForElements и getClassesAttributes вне слушателя, но они являются зависимыми от set, поэтому, если я соединю их с асинхронной функцией внутри ловушки, это будет тот же результат.Поэтому лучше всего было бы пропустить начальный запуск прослушивателя child_added и поместить его в эффект, который проверяет, был ли изменен setId, или просто взять одни и те же данные дважды.Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...