【问题标题】:Why my variable is not been set after a await promisse为什么我的变量在等待承诺后没有设置
【发布时间】:2021-11-23 10:57:37
【问题描述】:
const loadData = async () => {
        try {
            const data = await GetAllForms();
            setAllForms([...data]);
        } catch (err) {
            console.log(err);
        }
    }

我的变量数据正在接收来自GetAllForms 的数据(这是一个承诺函数),但是当我尝试分配给另一个变量时是空的,例如在这个控制台日志中显示一个空数组。但是,如果我只是 console.log(data) 数据显示正确,则问题仅出在 dataAux 我不知道这里发生了什么。 谢谢!

这里是 GetAllForms

export async function GetAllForms() {
    const formRef = await dbForms.collection("forms");
    const snapshot = await formRef.get();
    const dataFormattedArray = [] as IFormsFormatted[];

    snapshot.forEach(async doc => {
        const docData = doc.data() as IForms
        const aux = [] as FormsData[];

        for (const id of docData.formsFieldId) {
            const test = await GetOneFormsField(id);
            aux.push(test);
        }

        const dataFormatted = { ...docData, formsFieldId: [...aux] }

        dataFormattedArray.push(dataFormatted);
    })
    
    return dataFormattedArray;
}

如果我在 setAllForms 之后检查 de allForms 变量,则为空。

【问题讨论】:

  • GetAllForms() 实际上是返回一个数组吗?旁注 - 在 setAllForms() 中传递 dataAux 时,您不必传播它。它已经被传播了,你没有改变它的状态。 (我还假设您将在那里对 dataAux 做更多的事情,而不仅仅是 console.log 它)。
  • 不清楚你为什么要复制这么多副本。你就不能setAllForms(data)吗?
  • 您的getAllForms 可能是问题所在,您能出示一下代码吗?
  • 这意味着 GetAllForms 或其他负责修改数据的东西被搞砸了并导致了竞争条件,即在 GetAllForms 承诺解决后发生了一些事情。 GetAllForms 对问题至关重要,问题不包含它。
  • 我放 dataAux 只是为了查看分配是否正确。仅用于调试建议。是的,GetAllForms 正在返回一个数组

标签: javascript reactjs variables async-await use-state


【解决方案1】:

我解决了这个问题...确实是forEach,我只是重写了数据获取,用for ... of替换了forEach

await Promise.all(snapshot.docs.map(async doc => {  //Fetching in Paralel the data
        const docData = doc.data() as IForms
        const aux = [] as FormsData[];
        
        for (const id of docData.formsFieldId) {
            const test = await GetOneFormsField(id);
            aux.push(test);
        }

        const dataFormatted = { ...docData, formsFieldId: [...aux] }

        dataFormattedArray.push(dataFormatted);

    }))

感谢所有回复此问题的人!干杯!

【讨论】:

    猜你喜欢
    • 2019-04-29
    • 2018-06-16
    • 2021-01-02
    • 2019-06-20
    • 1970-01-01
    • 2017-06-24
    • 2020-04-30
    • 2021-10-14
    • 2022-01-09
    相关资源
    最近更新 更多