【问题标题】:Async Promiss.all not waiting for callbackAsync Promise.all 不等待回调
【发布时间】:2020-11-19 01:59:35
【问题描述】:

我有一系列帖子并像这样循环浏览每个帖子:

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

【问题讨论】:

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


    【解决方案1】:

    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 作为参数,并执行您的 per post 查询并返回 Promise(将被解析为 obj)。然后我们将每个帖子的 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 循环应该在异步函数中

    【讨论】:

    • 非常感谢您的解释。它现在正在工作,现在我了解它是如何工作的。从早上起我就一直坚持下去,真是太感谢你了。
    猜你喜欢
    • 2021-03-21
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 2020-11-01
    • 1970-01-01
    相关资源
    最近更新 更多