gpt4 book ai didi

javascript - 如何映射 `.find()`返回的数据?

转载 作者:行者123 更新时间:2023-12-02 23:52:54 27 4
gpt4 key购买 nike

我有一个简单的功能:

const oldUsers = Users.find(
{
isReminded: false,
creationDate: {
"$lt": new Date(Date.now() - thirtyDays),
},
},
);

然后:

export const notifyOldUsers = () => 
Array.isArray(oldUsers) ? oldUsers.map(async(user, i) => {
await Users.updateOne({ _id: user._id }, { "$set": { isReminded: true }});

await transporter.sendMail(sendMail));
}) : [];
};

但问题是 oldUsers 返回 object,如果我 console.log 它,它是一个复杂的查询对象。

问题:如何正确循环 .find() 生成的数据?

最佳答案

首先,Users.find() 是一个异步操作,因此 oldUsers 始终是未定义的。您需要等待它(如果您没有使用 promise ,则必须使用回调)。

const oldUsers = await Users.find(...)

其次,您的 notifyOldUsers 函数不是异步的,因此它运行映射函数,但立即退出,而不是等待映射的异步操作完成。

通常,在映射异步操作时,您应该使用 Promise.all() 来收集回调函数返回的所有 Promise 并等待它们全部解析。

export const notifyOldUsers = async () => {
const promises = oldUsers.map(async (user) => {
await Users.updateOne({ _id: user._id }, { "$set": { isReminded: true }})
await transporter.sendMail(sendMail))
})

return Promise.all(promises)
}

我特意将映射从 Promise.all() 中分离出来,以说明返回的 Promise 的映射。这可以进一步优化为以下内容。

export const async notifyOldUsers = async () => {
return Promise.all( oldUsers.map(async (user) => {
await Users.updateOne({ _id: user._id }, { "$set": { isReminded: true }})
await transporter.sendMail(sendMail))
}) )
}

在这两种情况下,这个异步函数都会返回一个新的 Promise,其值将是一个包含整个映射结果的数组。

关于javascript - 如何映射 `.find()`返回的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55563311/

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