gpt4 book ai didi

javascript - 修改并返回异步函数内的对象

转载 作者:行者123 更新时间:2023-12-04 10:12:11 26 4
gpt4 key购买 nike

我想在异步 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你可以awaitasync 中包装您想要异步执行的所有内容后函数,像这样:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com