检索 Promise 中的值
To retrieve a value in a Promise
我有这样的方法,我想填充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;
}
控制台输出为
您的异步调用需要先等待 returns。像这样...
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;
}
我认为使用这样的 async
功能你会玩得更开心。这个想法是使用 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;
}
我有这样的方法,我想填充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;
}
控制台输出为
您的异步调用需要先等待 returns。像这样...
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;
}
我认为使用这样的 async
功能你会玩得更开心。这个想法是使用 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;
}