函数内部修改并返回对象"/>
在异步函数内部修改并返回对象
我想在异步js代码中修改对象(userTracker
)。运行函数(fetchUsers
)后,我希望在所述对象上具有更新的字段。但是在函数中修改对象后,我仍然会得到undefined
。我该如何实现?
我的代码:
let userTracker = {
counter : 0,
data : []
}
function fetchUsers(userTracker) {
let filter = {"some" : "conditions"}
User.find(filter).exec() // I am deliberately not calling the `limit()` function. I have a goal to achieve
.then( (users ) => {
return users.forEach((user) => {
if (userTracker.counter < 20) {
userTracker.data.push(user)
userTracker.counter += 1
} else {
return
}
})
})
.catch(err => {
console.log(err)
})
}
fetchUsers(userTracker)
console.log(userTracker) // It logs `{}`. Accessing any field on the object shows `undefined`
运行userTracker
函数后如何访问已填充的fetchUsers
对象?我想结束这样的事情
我想要实现的目标:
userTracker = {
counter : 8,
data : [
user1, user2, user3, ...
]
}
我很喜欢异步编程,非常感谢您提供有关如何实现上述所需输出的任何帮助。
回答如下:每the specification,find
函数返回一个Promise
,在将要异步执行的所有内容包装在await
函数中之后,您就可以async
,如下所示:
let userTracker = {
counter : 0,
data : []
}
async function fetchUsers(userTracker) {
let filter = {"some" : "conditions"}
let users = await User.find(filter).exec()
users.forEach((user) => {
if (userTracker.counter < 20) {
userTracker.data.push(user)
userTracker.counter += 1
} else {
return
}
})
}
async function container() {
await fetchUsers(userTracker)
console.log(userTracker)
}
container()
也建议:在这种情况下,forEach
不是最佳的迭代方法。由于您要在20点之后停止添加用户,因此在20点之后退出fetchUsers
功能就很有意义。例如,如果有10000个用户,则不必要地遍历所有用户并运行比较,当然瓶颈。 no way to exit the parent function内部有forEach
。也就是说,最好使用传统循环并在计数器达到20后调用return
,这将退出fetchUsers
并停止迭代用户。
更多推荐
在异步函数内部修改并返回对象
发布评论