簡體   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