【发布时间】:2018-06-10 02:15:42
【问题描述】:
我有一个循环遍历一组用户,这个循环是异步的,我想做的是为每个用户创建一个新文档并保存它并等待它保存然后转到下一个用户.我能够处理何时转移到下一个用户,所以我的问题是在保存新文档数据时。我正在使用猫鼬保存方法。
主函数正在运行循环,这里是一个示例。 注意:'async' 是异步模块 v2.6.0
async.forEach(users, (user, callback)=>{
console.log(`Checking ${user.first_name}`);
createNewDocument(user, (err)=>{
if(!err) {
console.log("New document created.");
callback();
}
}, (err)=>{
if(!err){
console.log("All users were updated");
}
});
}
非异步方法
users.forEach((user)=>{
console.log(`Checking ${user.first_name}`);
createNewDocument(user, (err)=>{
if(!err) {
console.log("New document created.");
}
});
});
createNewDocument 函数
function createNewDocument(user, callback)
{
console.log("Creating a new doc...");
let doc = new Doc();
doc.save((err)=>{
if(!err){
console.log(`New doc created for user ${user.first_name}`);
callback;
}
});
console.log("Creating a new doc finished executing...");
}
一切都已执行,我在日志中得到的最后一件事是所有用户的“为用户创建的新文档......”。 我已经尝试了很多东西,我尝试将 doc.save 放入一个 Promise 中,但效果不佳,不知道我现在应该做什么。
编辑:在转到下一个用户之前创建新文档对我来说很重要,我不想将它们添加到调用数组然后执行它,我需要检查上一个文档实际存在并在下次循环进入时从中获取一些数据
【问题讨论】:
-
“我想做的是为每个用户创建一个新文档并保存它,然后等待它保存,然后转到下一个用户”。那你为什么要使用异步循环呢?异步的全部意义在于不要等待。
-
我之前使用了非异步循环,它导致了同样的问题,直到有人建议使用异步,这就是我的确切观点,异步不等待,他们说回调会控制它。
-
"callbacks" 实际上与异步行为无关。有很多使用回调的同步函数。原生
Array.forEach使用一个。 -
@gforce301 我也用过,我编辑发布并包含该功能,您可能想看看它,它仍然会导致完全相同的问题。
-
看来
doc.save也是异步的,这就是它仍在发生的原因。
标签: javascript node.js asynchronous mongoose synchronization