我想在异步 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 之后停止添加用户,因此退出 fetchUsers
是有意义的。 20 之后的函数。例如,如果有 10000 个用户,则必须不必要地遍历所有用户并运行比较,这肯定是一个瓶颈。还有 no way to exit the parent function从内部 forEach
.也就是说,最好使用传统循环并调用 return
计数器达到 20 后退出 fetchUsers
并停止迭代用户。
关于javascript - 修改并返回异步函数内的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61273658/