最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

在异步函数内部修改并返回对象

网站源码admin20浏览0评论

在异步函数内部修改并返回对象

在异步函数内部修改并返回对象

我想在异步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并停止迭代用户。

发布评论

评论列表(0)

  1. 暂无评论