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