我有一个循环遍历用户数组,这个循环是异步的,我想要做的是为每个用户创建一个新文档并保存它并等待它保存,然后转到下一个用户。我能够处理何时转到下一个用户,所以我的问题是在保存新文档数据时。我正在使用 Mongoose 保存方法。
主要功能是运行循环,这是一个示例。注意:“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 中,但效果不佳,不知道现在应该做什么。
编辑:在转到下一个用户之前创建新文档对我来说很重要,我不想将它们添加到调用数组然后执行它,我需要检查前一个文档是否确实存在,并在下次循环进入时从中获取一些数据
多年来人们一直在 promise 嵌套异步和正确的错误处理。最近出现了 async
和 await
语法,使 Promise 看起来像 C# 代码,但重要的是了解 Promise 如何工作,因为该语法使用 Promise。
使用 promise ,您可以执行以下操作:
const createNewDocument = user =>
new Promise(
(resolve,reject) => {
console.log("Creating a new doc...");
let doc = new Doc();
doc.save(
err=>{
console.log("Creating a new doc finished executing...");
err
? reject(err)
: resolve(`New doc created for user ${user.first_name}`)
}
);
}
);
const saveDocuments = (users,processedSoFar=[]) => {
if(users.length===0){
return processedSoFar;
}
console.log(`Checking ${users[0].first_name}`);
return createNewDocument(users[0])
.then(
result=>{
console.log("New document created.");
processedSoFar.push(users[0]);
return saveDocuments(users.slice(1),processedSoFar);
}
)
.catch(
err=>Promise.reject([err,processedSoFar])
);
}
saveDocuments(users)
.then(
result=>{
console.log("Processed the following users:",users);
}
)
.catch(
([err,processed])=>{
console.log(
"Something went wrong:",err,
"Processed so far:",processed
)
}
)
我是一名优秀的程序员,十分优秀!