[英]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.