两个Array.maps内的异步请求

Async request inside two Array.maps

我正在创建一个 API 来连接我的 Google Cloud Firestore 数据库。我在我的应用程序中查询 'pipelines'。该请求将 return 管道数组(即 JSON 对象数组)。每个 JSON 对象都有一个 users 属性 ,它等于一个 字符串数组 。每个字符串代表我数据库中的一个 用户 ID

我想做的是映射每个管道,然后在每个管道内部映射用户数组,以异步调用我的数据库以通过用户 ID 获取该用户的信息。

我 运行 很难等待所有异步请求完成并正确 return 数据。目前我有以下代码:

pipelineResults.map(pipeline => {


    pipeline.users = pipeline.users.map(user => {
        return promises.push(db.collection('users')
            .doc(user)
            .get()
            .then(snapshot => {
                user = snapshot.data();
                console.log(user);
                return user;
            }));
    });

    return pipeline;

});

Promise.all(promises)
    .then(result => {
        res.send(pipelineResults);
    });

pipelineResults JSON 定义如下(映射之前):

[
{
    "integrations": [
        {
            "dateAdded": {
                "_seconds": 1553435585,
                "_nanoseconds": 769000000
            },
            "vendorId": "abcdefg",
            "integrationId": "ahdhfyer",
            "addedBy": "xEcscnBo0PGgOEwb2LGj",
            "used": 1
        }
    ],
    "users": [
        "xEcscnBo0PGgOEwb2LGj"
    ],
    "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras nec augue dapibus, interdum felis ac, tristique nunc. Donec justo ex, pulvinar a nisl et, consequat porta nunc.",
    "scheduled": {
        "isScheduled": false
    },
    "orgId": "ae35gt654",
    "runInfo": null,
    "name": "Development pipeline",
    "teams": [
        {
            "users": [
                "xEcscnBo0PGgOEwb2LGj"
            ],
            "createdOn": {
                "_seconds": 1553435585,
                "_nanoseconds": 769000000
            },
            "id": "abfe4h6uuy",
            "createdBy": "xEcscnBo0PGgOEwb2LGj",
            "userCount": 1
        }
    ],
    "createdOn": {
        "_seconds": 1553435585,
        "_nanoseconds": 769000000
    },
    "createdBy": "xEcscnBo0PGgOEwb2LGj"
}
]

在运行上面的代码映射管道和用户之后,管道上的用户属性现在只是一个数组,里面有1:

"users": [
        1
]

用户对象应如下所示:

{ firstName: 'Alex',
  activeIntegrations: 14,
  position: 'Manager',
  email: 'alex@alexwiley.co.uk',
  lastName: 'Wiley',
}

我很确定我没有return正在或等待异步调用。

总结 在两个映射函数中执行异步调用。

非常感谢任何帮助。

您正在尝试分配 pipeline.users 而 promise 尚未解决;试试这个:

试试这个:

return Promise.all(pipelineResults.map(pipeline => {
    return Promise.all(pipeline.users.map(user => 
        db.collection('users')
            .doc(user)
            .get()
            .then(snapshot => {
                user = snapshot.data();
                console.log(user);
                return user;
            });
    ))
    .then(users => {
       pipeline.users = users;
    });    
}))
.then(() => res.send(pipelineResults));