异步 Promiss.all 不等待回调
Async Promiss.all not waiting for callback
我有一个 post 数组并像这样遍历每个 post:
arr = []
obj = {}
await Promise.all(allPosts.map(async (post) => {
let userData = await User.getByUserId(post.user_id);
obj.userData = userData[0];
obj.postDetails = post;
let productData = await Post.getPostTaggedProducts(post.id);
obj.productData = productData;
arr.push(obj)
}))
这是模型中的代码:
User.getByUserId = (id) => {
return new Promise(function (resolve, reject) {
config.query("SELECT * FROM Users WHERE id = ?", id, (err, result) => {
if (err) {
reject(err)
} else {
resolve(result)
}
})
})
}
但是 arr 并未使用来自回调的新数据推送 obj。我怎样才能确保仅当从回调中接收到数据时循环才继续进行。谁能告诉我我做错了什么?
Promise.all 接受一组承诺和 returns 每个承诺解析值的数组
所以,
let arr = await Promise.all(allPosts.map(post => getPosts(post)));
async function getPosts(post){
let obj = {};
let userData = await User.getByUserId(post.user_id);
obj.userData = userData[0];
obj.postDetails = post;
let productData = await Post.getPostTaggedProducts(post.id);
obj.productData = productData;
return obj;
};
说明:getPosts 函数将 post 作为参数并执行您的每个 post 查询和 returns Promise(将解析为 obj)。然后我们将每个 post 的 allPosts 映射到 getPosts,因此 Promise.all 将获得承诺数组。
您也可以这样做:
让 arr = [];
for(let post of allPosts){
let obj = {};
let userData = await User.getByUserId(post.user_id);
obj.userData = userData[0];
obj.postDetails = post;
let productData = await Post.getPostTaggedProducts(post.id);
obj.productData = productData;
arr.push(obj);
};
注意:for 循环应该在异步函数中
我有一个 post 数组并像这样遍历每个 post:
arr = []
obj = {}
await Promise.all(allPosts.map(async (post) => {
let userData = await User.getByUserId(post.user_id);
obj.userData = userData[0];
obj.postDetails = post;
let productData = await Post.getPostTaggedProducts(post.id);
obj.productData = productData;
arr.push(obj)
}))
这是模型中的代码:
User.getByUserId = (id) => {
return new Promise(function (resolve, reject) {
config.query("SELECT * FROM Users WHERE id = ?", id, (err, result) => {
if (err) {
reject(err)
} else {
resolve(result)
}
})
})
}
但是 arr 并未使用来自回调的新数据推送 obj。我怎样才能确保仅当从回调中接收到数据时循环才继续进行。谁能告诉我我做错了什么?
Promise.all 接受一组承诺和 returns 每个承诺解析值的数组
所以,
let arr = await Promise.all(allPosts.map(post => getPosts(post)));
async function getPosts(post){
let obj = {};
let userData = await User.getByUserId(post.user_id);
obj.userData = userData[0];
obj.postDetails = post;
let productData = await Post.getPostTaggedProducts(post.id);
obj.productData = productData;
return obj;
};
说明:getPosts 函数将 post 作为参数并执行您的每个 post 查询和 returns Promise(将解析为 obj)。然后我们将每个 post 的 allPosts 映射到 getPosts,因此 Promise.all 将获得承诺数组。
您也可以这样做: 让 arr = [];
for(let post of allPosts){
let obj = {};
let userData = await User.getByUserId(post.user_id);
obj.userData = userData[0];
obj.postDetails = post;
let productData = await Post.getPostTaggedProducts(post.id);
obj.productData = productData;
arr.push(obj);
};
注意:for 循环应该在异步函数中