我现在已经在这几个小时里苦苦挣扎了。我正在尝试从我的数据库中收集数据并将其推送到数组。循环完成后,我想返回包含检索数据的数组。现在我设法创建一个async forEach循环,但是(正如预期的那样)我收到一个空数组,因为它不会等待函数结束。
这是我的代码:
StatusHandler.prototype.recover = async function recover(modelIds) {
try {
const items = [];
modelIds.forEach(async (id) => {
try {
const query = {
[this.modelId]: ObjectId(id),
deleted: 'Y',
xms_status: {
$nin: [/inactive/, /maintenance/],
},
};
const model = await this.Model.findOne(query);
console.log(model); // Shows the correct data.
items.push(model);
} catch (err) {
throw err;
}
}, this);
return items; // Returns empty array
} catch (err) {
throw err;
}
};
我看到了一些相关问题,并注意到我可以使用for..of
循环,但我无法使用它,因为Airbnb JavaScript样式指南(它建议使用forEach
代替{{1} }})。
提前致谢!
答案 0 :(得分:1)
我不明白你为什么要遍历一系列ID并使用findOne
来检索你的对象,你可以使用这样的东西:
await this.Model.find({_id: {$in: modelIds}});
此外,为什么不使用forEach
而不是使用map
来推送数组?
我认为你可以这样做:
async function recover(modelIds) {
return modelsIds.map(async (modelId, i) => {
const query = "..."; // your query with the id
return await this.Model.findOne(query);
})
}
你的函数用try/catch
调用的环绕声来捕捉函数执行过程中出现的错误。