异步Promiss.all不等待回调

时间:2020-07-29 13:03:48

标签: javascript node.js express async-await callback

我有一系列的帖子,像这样循环遍历每个帖子:

Messages.Add("Hi");

这是模型中的代码:

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

但是arr不会使用来自回调的新数据推送obj。我如何确保仅当从回调接收到数据时,循环才会更进一步。谁能告诉我我在做什么错?

1 个答案:

答案 0 :(得分:0)

Promise.all接受一个promise数组,并返回每个promise解析值的数组

所以

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作为参数,并按每次查询进行查询并返回Promise(它将被解析为obj)。然后我们将allPosts映射到每个帖子的getPosts,因此,通过此Promise.all将获得promise数组。

您也可以这样: 让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循环应在异步函数内部