Ждите пока не сработают функции внутри - PullRequest
2 голосов
/ 01 апреля 2019

У меня есть следующие функции:

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

        const elements = Object.keys(set);
        const elementsClasses = await getClassesForElements(projectId, elements);

        const classes = Object.values(elementsClasses);
        const classesAttributes = await getClassesAttributes(projectId, classes);

        dispatch(setClasses(classesAttributes));
        dispatch(setElements(elementsClasses));
        dispatch(setSet(set));
    })
);

export const getPageDetails = (projectId, pageId) => (
    dispatch => (
        projectId && pageId &&
        pagesDb
        .child(`${projectId}/${pageId}`)
        .once("value", async snap => {
            const pageDetails = snap.val();
            const { setId } = pageDetails;

            await getSet(projectId, setId, dispatch)

            dispatch(
                setPageDetails(
                    pageDetails
                )
            );
        })
    )
);

У меня не так много опыта работы с асинхронными функциями, но я хочу заработать getPageDetails с dispatch(setPageDetails(pageDetails)), пока getSet не завершит все рассылки. В вышеперечисленных функциях все работает отлично, за исключением того, что getSet заканчивается последней. Как это решить?

1 Ответ

1 голос
/ 01 апреля 2019

await приостановит работу только в том случае, если ожидаемое выражение оценивает обещание.

once принимает обратный вызов, поэтому, по-видимому, оно не возвращает обещание.

Поэтому вам нужно обернуть его функцией, которая возвращает обещание , которое разрешается после выполнения once (что означает преобразование всех вызовов dispatch тоже).

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