等待直到功能被触发

时间:2019-04-01 12:16:25

标签: javascript firebase redux

我有以下功能:

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
                )
            );
        })
    )
);

我在异步功能方面没有太多经验,但是我想赚的是让getPageDetailsdispatch(setPageDetails(pageDetails))等到getSet完成所有调度。在以上功能中,所有内容都可以正常工作,只是getSet最晚完成。该如何解决?

1 个答案:

答案 0 :(得分:1)

await仅在您正在等待的表达式评估为诺言时才会暂停。

once进行了回调,因此大概不会返回promise。

因此,您需要wrap it with a function which does return a promise来解决once完成时的情况(这也意味着转换所有dispatch调用)。