[英]How can I make a loop inside an async function with Playwright?
[英]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.