javascript - 如何映射`.find()`返回的数据?
问题描述
我有一个简单的功能:
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
这样做,它会很复杂Query
对象。
问题:如何正确循环.find()
产生的数据?
解决方案
首先,这Users.find()
是一个异步操作,所以oldUsers
总是未定义的。您需要await
它(如果您不使用承诺,则必须使用回调)。
const oldUsers = await Users.find(...)
其次,您的notifyOldUsers
函数不是异步的,因此它会运行映射函数,但会立即退出,而不是等待映射的异步操作完成。
通常,在映射异步操作时,您应该使用 aPromise.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()
以说明返回的承诺映射。这可以进一步优化为以下内容。
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,它的值将是一个包含整个地图结果的数组。
推荐阅读
- php - 如何实现对单字段单列中以逗号分隔的多条记录的搜索查询?
- python - 如何从 Python 中的另一个项目导入模块?
- c++ - 缓冲区用不需要的数据填充 char 数组中的最后一个空格
- c# - ASP.NET Core 2.2 Web API 在 IIS 上托管后给出 404
- bash - 在linux上安装包时如何绕过用户确认
- javascript - 需要多次关闭警报框
- javascript - 如何防止滚动上的更改检测?(角)
- python - 如何使用 Python / Pandas 在 Excel 中插入新行(有条件)
- java - Java 最佳实践静态最终映射值
- docker - 当它高于某个内存限制时重新启动 docker 容器?