我有一个函数getAliasesByRoleDetailed(role)
,该函数负责在给定role
的情况下获取用户数据(此函数使用axios来获取数据)。
此函数的输出如下:
[
{
alias: 'xxxx',
Role: 'Admin',
grantedBy: 'rnfnf',
timestamp: '1591375676333'
},
{
alias: 'vbjp',
Role: 'Admin',
'Granted By': 'hjkds',
timestamp: '1588013678236'
}
]
可以执行以下操作:
const response = await getAliasesByRoleDetailed(role);
,一旦数据可用,就继续使用response
做事。
但是如果我想在继续执行代码之前多次调用此getAliasesByRoleDetailed(role)
函数并将结果.push()
放入数组中怎么办?
getAliasesByRoleDetailed(role)
这样的数组中的每个元素执行['Admin','Trainer','Manager']
,并将每次执行的结果推送到resultsArray
中。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()
尝试了几种解决方案,但一直陷于困境。有一个简单的解决方案吗?
答案 0 :(得分:2)
如果我正确理解了您的问题,则您可能想使用Promise.all
。
这将等待所有内部承诺(传递给函数的承诺)解决,然后再解决自身。
// inside an async function
const roles = ['Admin', 'Trainer', 'Manager'];
const results = await Promise.all(roles.map(role => {
return getAliasesByRoleDetailed(role);
}));
// results should now have all the results available
然后可以使用Array.flat
// inside the same function
const flattenResults = Array.flat(results);
答案 1 :(得分:1)
由于您提到了异步/等待,所以我假设getAliasesByRoleDetailed
返回一个Promise
。因此,您必须执行类似的操作
let resultsArray = await Promise.all(['Admin','Trainer','Manager'].map(getAliasesByRoleDetailed))
答案 2 :(得分:1)
let result = await data.reduce(async (promise, value) => {
await promise;
let response = await getAliasesByRoleDetailed(value.Role);
//do something with response
return response;
}, Promise.resolve());
答案 3 :(得分:1)
您可以考虑使用Promise.all:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
根据您的情况,您可以尝试以下操作:
Promise.all(['Admin','Trainer','Manager'].map(getAliasesByRoleDetailed)).then(resultsArray => {
// do your stuff
})
答案 4 :(得分:1)
使用Promise.all或Promise.allSettled Promise.all仅在所有承诺都已解决时才会解决 因此,为什么我认为您可能应该使用Promise.allSettled()来等待所有承诺完成,无论其中一个是否被拒绝
roles=['Admin','Trainer','Manager']
var result=Promise.allSettled(roles.map(r=>getAliasesByRoleDetailed(role)))