繁体   English   中英

异步函数调用顺序

[英]Order of Async function calls

我正在为我的足球队制作一个 React 应用程序,以跟踪每个成员的付款和债务。 我正在尝试在数据库中搜索每个季节的记录,如果没有找到记录,则删除一个成员。 目前,会员被删除,然后搜索数据库。

这是代码块(也可以在 GitHub 上看到我的应用程序的其余部分)。 我使用 Firebase 来存储我所有的数据。

import database from '../firebase/firebase';

export const startRemoveMember = ( playerUuid, seasonList ) => 
{
    return (dispatch, getState) =>
    {
        let canDelete = true;
        const uid = getState().auth.uid;

        // This should resolve first
        seasonList.forEach( (season) =>
        {
            database.ref(`subs-tracker/users/${uid}/debts_and_payments/${season.seasonUuid}`)
                .once('value')
                .then((records) =>
                {
                    records.forEach((childRecord) =>
                    {
                        if(childRecord.val().playerUuid === playerUuid)
                        {
                            canDelete = false;
                            return true; // breaks loop if record is found
                        };
                    });
                });
        });

        // This resolves first before block above
        if(canDelete)
        {
            alert('Deleted');
            return database.ref(`subs-tracker/users/${uid}/members/${playerUuid}`)
                .remove()
                .then((ref) =>
                {
                    dispatch(removeMember(playerUuid)); // Calls removeMember() function to remove the Member from the State of the App
                })
        }
        else
        {
            alert('Cannot Delete. Member has records');
            return false;
        }
    };
};

我可能缺少一些基本的东西。 我不是数据库和异步调用方面的专家。 任何帮助你将不胜感激:)

在您的外部forEach回调中,您在每次迭代中都创建了一个承诺。 所有这些承诺都必须首先解决。

您将不得不等待所有这些。

因此,不要执行forEach ,而是使用map以便您可以将这些承诺收集在一个数组中。 然后对这些调用Promise.all ,这样你就有了一个承诺,当所有这些都解决了时,它就会解决。 然后将删除代码放在then回调中。 显然不能同步执行。

这也意味着您必须考虑(dispatch, getState) =>函数的返回值。 该功能无法以同步方式指示成功。 所以它也应该最好返回一个承诺。

        const promises = seasonList.map( (season) =>
            database.ref(`subs-tracker/users/${uid}/debts_and_payments/${season.seasonUuid}`)
                .once('value')
                .then((records) =>
                    records.forEach((childRecord) => // breaks on true
                        childRecord.val().playerUuid === playerUuid
                    );
                );
        );

        return Promise.all(promises).then(findings =>
            findings.includes(true)
        ).then(cannotDelete => {
            if (cannotDelete) {
                alert('Cannot Delete. Member has records');
                return false;
            } else {
                alert('Deleted');
                return database.ref(`subs-tracker/users/${uid}/members/${playerUuid}`)
                    .remove()
                    .then((ref) => {
                        dispatch(removeMember(playerUuid)); // Calls removeMember() function to remove the Member from the State of the App
                        return true; // To distinguish from false
                    });
            }
        });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM