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

标签 javascript node.js express mongoose async-await

我想在异步 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/

相关文章:

javascript - 如何在使用 localtunnel 公开本地主机时发布请求

javascript - Textarea - br 标签的新行,然后是特殊字符

javascript - kepler.gl 是否有任何有效的 react 示例?

node.js - 如何处理在我想要的之前返回的异步代码?

javascript - 如何使用 ajax 和 Node 从表单中获取请求

node.js - Sequelize : include association only IF

JavaScript setInterval 没有停止

javascript - 将国家代码转换为国家全名

node.js - api 与直接查询数据库相比如何

node.js - Firestore promise 在退回产品之前等待产品详细信息