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

时间:2020-07-16 18:53:00

标签: javascript node.js asynchronous async-await

我有一个函数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()放入数组中怎么办?

  1. 我想对像getAliasesByRoleDetailed(role)这样的数组中的每个元素执行['Admin','Trainer','Manager'],并将每次执行的结果推送到resultsArray中。
  2. 之后,所有调用都已完成并且结果在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()尝试了几种解决方案,但一直陷于困境。有一个简单的解决方案吗?

5 个答案:

答案 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.allPromise.allSettled Promise.all仅在所有承诺都已解决时才会解决 因此,为什么我认为您可能应该使用Promise.allSettled()来等待所有承诺完成,无论其中一个是否被拒绝

roles=['Admin','Trainer','Manager']
var result=Promise.allSettled(roles.map(r=>getAliasesByRoleDetailed(role))) 

相关问题