Reactjs 检索承诺中的值
我有一个这样的方法,我想填充teamMems阵列。我做错了什么Reactjs 检索承诺中的值,reactjs,typescript,promise,es6-promise,Reactjs,Typescript,Promise,Es6 Promise,我有一个这样的方法,我想填充teamMems阵列。我做错了什么 takeTeamMembers(client:any, teamIds:string[], projectId:string){ var teamMems :TeamMember[] = [] teamIds.forEach((teamId:string) =>{ client.getTeamMembersWithExtendedProperties(projectId, te
takeTeamMembers(client:any, teamIds:string[], projectId:string){
var teamMems :TeamMember[] = []
teamIds.forEach((teamId:string) =>{
client.getTeamMembersWithExtendedProperties(projectId, teamId, undefined, undefined).then(
function(items:any){
items.map((curr:any) => {
if(teamMems.filter((item:TeamMember) => {return item.memberId == curr.identity.id}).length == 0){
teamMems= [...teamMems, {teamIds: [teamId], memberId:curr.identity.id, name:curr.identity.displayName}]
}
else{
teamMems.filter((item:TeamMember)=> item.memberId == curr.identity.id)[0].teamIds.push(teamId);
}
})
console.log("1 return innermems", teamMems)
});
console.log("2 return ", teamMems)
})
console.log("before return ", teamMems)
return teamMems;
}
控制台输出为
在异步调用返回之前,需要等待它。像这样
takeTeamMembers(client:any, teamIds:string[], projectId:string){
var teamMems :TeamMember[] = []
var innerMems : TeamMember[] = []
// make function callback async here
teamIds.forEach(async (teamId:string) => {
// then await this function here
await client.getTeamMembersWithExtendedProperties(projectId, teamId, undefined, undefined).then(
function(items:any){
items.map((curr:any) => {
if(innerMems.filter((item:TeamMember) => {return item.memberId == curr.identity.id}).length == 0){
innerMems = [...innerMems, {teamIds: [teamId], memberId:curr.identity.id, name:curr.identity.displayName}]
}
else{
innerMems.filter((item:TeamMember)=> item.memberId == curr.identity.id)[0].teamIds.push(teamId);
}
})
teamMems = teamMems.concat(innerMems)
console.log("1 return innermems ", teamMems)
});
console.log("2 return ", teamMems)
})
console.log("before return ", teamMems)
return teamMems;
}
编辑2:
已对此呼叫进行修复
async function takeTeamMembers(client:any, teamIds:string[], projectId:string){
let teamMems :TeamMember[] = []
let innerMems : TeamMember[] = []
// remember to await the map call also
await Promise.all(await teamIds.map(async (teamId:string) => {
await client.getTeamMembersWithExtendedProperties(projectId, teamId, undefined, undefined).then(
(items:any) => {
items.map((curr:any) => {
if(innerMems.filter((item:any) => {return item.memberId == curr.identity.id}).length == 0){
innerMems = [...innerMems, {teamIds: [teamId], memberId:curr.identity.id, name:curr.identity.displayName}]
}
else{
innerMems.filter((item:any)=> item.memberId == curr.identity.id)[0].teamIds.push(teamId);
}
})
teamMems = teamMems.concat(innerMems);
});
}));
return teamMems;
}
我认为使用这样的异步函数会让您玩得更开心。其思想是使用Promise.all首先等待所有getTeamMembersWithExtendedProperties调用,然后只处理平面、正则数组
// dummy implementation to ensure types are correct, replace with your actual stuff
async function getTeamMembersWithExtendedProperties(projectId: string, teamId: string) {
return ["something"];
}
async function takeTeamMembers(client: any, teamIds: string[], projectId: string) {
const teamsAndMembers = await Promise.all(
teamIds.map(async (teamId) => ({
teamId,
members: await getTeamMembersWithExtendedProperties(projectId, teamId),
})),
);
const teamMems = [];
const innerMems = [];
teamsAndMembers.forEach(({ teamId, members }) => {
// Do the innerMems/teamMems logic here...
});
return teamMems;
}
您需要等待您拥有的异步函数。函数在异步到达您拥有的回调之前返回,特别是,您在teamIds.forEach中生成异步任务,而不是等待它们返回。尝试和理解代码首先应该做什么也非常困难,innerMems的东西在异步回调中发生了什么。@AKX我澄清为innerMems被丢弃,顺便说一下,再次感谢你的回答这不会起作用,因为异步函数返回一个承诺,forEach不等待它们。我明白你的意思,让我在@AKX进行调整