Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 检索承诺中的值_Reactjs_Typescript_Promise_Es6 Promise - Fatal编程技术网

Reactjs 检索承诺中的值

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

我有一个这样的方法,我想填充teamMems阵列。我做错了什么

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进行调整