使用Array.prototype.map异步等待'Promise {<pending>}

时间:2018-11-13 15:08:19

标签: javascript node.js asynchronous async-await

我知道关于同一错误的讨论有很多问题,并且我看到了大多数问题,但是这些问题并没有解决我的问题。 我写了这段代码:

const userOrganizationGroups = (organizationGroupsList) => {
 if (Array.isArray(organizationGroupsList) && organizationGroupsList.length) {
    const result = organizationGroupsList.map(async (element) => {
      const { organizationId, groupId } = element;
      const { Organizations, Groups } = models;


      const organization = await Organizations.findOne(
        { _id: organizationId },
        { name: 1, _id: 0 },
      );
      const group = await Groups.findOne({ _id: groupId });
      return Object.assign({}, {
        organizationName: organization.name,
        group: group.name,
      });
    });
    return result;
  }

};

当我调试代码时:

console.log('userOrganizationGroups : ',userOrganizationGroups(list))

我得到了这样的结果:

userOrganizationGroups: Promise { <pending> }

我发现了一个类似的问题:Promise { } - Trying to await for .map,我使用了问题中提到的解决方案:

const userOrganizationGroups = async (organizationGroupsList) => {


 if (Array.isArray(organizationGroupsList) && organizationGroupsList.length) {
    const result = await Promise.all(organizationGroupsList.map(async (element) => {
      const { organizationId, groupId } = element;
      const { Organizations, Groups } = models;


      const organization = await Organizations.findOne(
        { _id: organizationId },
        { name: 1, _id: 0 },
      );
      const group = await Groups.findOne({ _id: groupId });
      return Object.assign({}, {
        organizationName: organization.name,
        group: group.name,
      });
    }));
    return result;
  }

如何解决此问题?

2 个答案:

答案 0 :(得分:1)

代替

console.log('userOrganizationGroups : ',userOrganizationGroups(list))

使用

userOrganizationGroups(list).then( groups => console.log('userOrganizationGroups : ', groups)

(async () => { const groups = await userOrganizationGroups(list); console.log('userOrganizationGroups : ', groups); })();

答案 1 :(得分:0)

首先调用

console.log()是因为您没有等待使用awaitthen

所以您应该在下面写上而不是
 console.log('userOrganizationGroups : ',userOrganizationGroups(list))

;(async () => {
    const resultGroups = await userOrganizationGroups(list)
    resultGroups.forEach(group => {
      console.log(`group: ${JSON.stringfy(group, null, '  ')}`)
    })
})()