如何在循环内调用异步函数?

时间:2020-05-15 12:26:49

标签: javascript node.js

我在节点中有以下代码。在c:\$cygwin_folder\bin\bash.exe -c ("/usr/bin/scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -v -i /cygdrive/c/cygwin/home/myuser/.ssh/id_rsa /cygdrive/e/logs/$foldername/dir1/$foldername.zip root@10.10.10.10:~/") 中,它从数据库读取10个帖子,这是一个异步函数调用。对于每个帖子,它都需要阅读用户信息。来自数据库,这是另一个异步函数调用。如何使其在Node JS中工作?

getPosts

我正在考虑使用 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? } 之后将每个用户分配给每个帖子。

1 个答案:

答案 0 :(得分:0)

考虑对问题的处理略有不同。如果您等待迭代循环中的响应,则会导致性能下降。相反,您可以将它们全部推送到一个数组中并等待它们-这样它们都可以同时获取。

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之前考虑形成可以参考的用户列表。