提问者:小点点

Async允诺。all不等待回调


我有一个帖子数组,循环遍历每一个帖子,如下所示:

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)
            }))

这是Model中的代码:

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。 我如何才能确保只有当从回调接收到数据时循环才进一步。 有人能告诉我我做错了什么吗?


共1个答案

匿名用户

ALL接受一个承诺数组,并返回每个承诺解析值的数组

所以,

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查询并返回Promise(它将被解析为obj)。 然后我们为每个帖子映射allPosts到getPosts,因此通过这个允诺。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循环应该在异步函数中