两个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));
我正在创建一个 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));