繁体   English   中英

如何在循环内调用异步 function?

[英]How can I call async function inside a loop?

我在节点中有以下代码。 getPosts中,它从数据库中读取 10 个帖子,这是一个异步 function 调用。 并且对于每个帖子,它都需要读取用户信息。 来自数据库,这是另一个异步 function 调用。 如何使它在节点 js 中工作?


const getUser = async (userId) => {
    // read user from database
}

const getPosts =async () => {
  const posts = await getPostsFromDB(10); // get 10 posts from database
  for(let i=0; i<posts.length; i++){
        posts[i].user = await getUser(posts[i].userId) // ERROR: I can't call await inside a loop
  }

}

我正在考虑使用Promise.all()如下所示:

const getPosts =async () => {
  const posts = await getPostsFromDB(10); // get 10 posts from database
  const allProms = posts.map(post => getUser(post.userId));
  Promise.all(allProms); // how can I assign each user to each post?

}

但我不知道如何在调用Promise.all()后将每个用户分配给每个帖子。

考虑稍微不同地处理问题。 如果您在迭代循环中等待响应,则会产生较差的性能。 相反,您可以将它们全部推入一个数组并等待它们——这样它们就可以同时获取。

const getUser = async (userId) => {
  try {
    // read
  } catch (e) {
    // catch errors
  }

  // return data
}

const getPosts = async () => {
  const posts = await getPostsFromDB(10); // get 10 posts from database
  const userRequests = posts.map((post, index) => getUser(post.userId))
  const users = await Promise.all(userRequests)

  return posts.map((post, index) => {
    post.user = users[index]
  })
}

如果您认为您可能有重复的userId ,请考虑在调用getUser之前形成您可以引用的用户列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM