Javascript 如何在继续执行流之前等待多个异步调用完成?

Javascript 如何在继续执行流之前等待多个异步调用完成?,javascript,node.js,asynchronous,async-await,Javascript,Node.js,Asynchronous,Async Await,我有一个函数getAliaseByroledeTaileDrole,它负责在给定角色的情况下获取用户数据。该函数使用axios获取数据 此函数的输出如下所示: [ { alias: 'xxxx', Role: 'Admin', grantedBy: 'rnfnf', timestamp: '1591375676333' }, { alias: 'vbjp', Role

我有一个函数getAliaseByroledeTaileDrole,它负责在给定角色的情况下获取用户数据。该函数使用axios获取数据

此函数的输出如下所示:

[     
    {
        alias: 'xxxx',
        Role: 'Admin',
        grantedBy: 'rnfnf',
        timestamp: '1591375676333'
    },
    {
        alias: 'vbjp',
        Role: 'Admin',
        'Granted By': 'hjkds',
        timestamp: '1588013678236'
    }
]
const response = await getAliasesByRoleDetailed(role);
可以这样做:

[     
    {
        alias: 'xxxx',
        Role: 'Admin',
        grantedBy: 'rnfnf',
        timestamp: '1591375676333'
    },
    {
        alias: 'vbjp',
        Role: 'Admin',
        'Granted By': 'hjkds',
        timestamp: '1588013678236'
    }
]
const response = await getAliasesByRoleDetailed(role);
然后在数据可用后,继续进行响应

但是,如果我想多次调用这个getAliaseByroledeTaileDrole函数,并在继续执行代码之前将结果推送到数组中,该怎么办

我想为数组中的每个元素执行getAliasesByRoleDetailedrole,比如['Admin'、'Trainer'、'Manager'],并将每次执行的结果推送到ResultArray中。 在所有调用完成并且结果在resultsArray中可用之后,我想使用resultsArray数据继续我的逻辑。 因此,理想情况下:

//Inside a function...

[getting data using getAliasesByRoleDetailed(role) ...]

resultsArray.forEach( (e) => {
    //Do something useful with all these element I now have!
}

我已经尝试过使用async/await和.forEach的两种解决方案,但一直遇到问题。有一个简单的解决方法吗?

如果我正确理解了你的问题,你可能会想利用它

这将等待传递到函数中的所有内部承诺在解析自身之前解析

//在异步函数中 常量角色=[“管理员”、“培训师”、“经理”]; const results=wait Promise.allroles.maprole=>{ 返回getAliaseByroledeTaileDrole; }; //结果现在应该具有所有可用的结果 然后,可以使用

//在同一个函数中 const flattresults=Array.flattresults;
因为您提到了async/await,所以我假设getAliasesByRoleDetailed返回一个承诺。因此,你必须做一些类似的事情

let resultsArray = await Promise.all(['Admin','Trainer','Manager'].map(getAliasesByRoleDetailed))

<>你可以考虑使用承诺:全部:

在您的情况下,您可以尝试以下方法:

Promise.all(['Admin','Trainer','Manager'].map(getAliasesByRoleDetailed)).then(resultsArray => {
  // do your stuff
})
使用或 只有所有的承诺都解决了,所有的承诺才会解决 因此,我认为您可能应该使用Promise.allSettled,因为它等待所有承诺完成,而不管其中一个承诺是否被拒绝 角色=['Admin'、'Trainer'、'Manager']
var result=Promise.allsettedroles.mapr=>getAliasesByRoleDetailedrole这太棒了,它工作得很好,Array.flat帮助很大。我感谢你和其他人的帮助!我很高兴能帮上忙。请查看Sven.hig的回答,他指出,如果其中一个请求失败,您可能需要使用Promise.allselled。取决于您的错误处理策略:这很有见地,谢谢您的帮助。我很感激这一澄清,我将不得不考虑哪一个最适合我的需要。如果有人传递无效数据,我可能希望它失败-也许不是,我会考虑一下…: