我在节点中有以下代码。在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?
}
之后将每个用户分配给每个帖子。
答案 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
之前考虑形成可以参考的用户列表。