我有以下功能:
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
最晚完成。该如何解决?
答案 0 :(得分:1)
await
仅在您正在等待的表达式评估为诺言时才会暂停。
once
进行了回调,因此大概不会返回promise。
因此,您需要wrap it with a function which does return a promise来解决once
完成时的情况(这也意味着转换所有dispatch
调用)。