[英]Getting a function to wait for a post middleware save to finish before continuing
[英]Wait for save before continuing with the function
我有一个循环遍历一系列用户的循环,该循环是异步的,我要为每个用户创建一个新文档并保存并等待其保存,然后移至下一个用户。 我能够处理何时移至下一个用户,所以我的问题是在保存新文档数据时。 我正在使用猫鼬保存方法。
主要功能是运行循环,这是一个示例。 注意:“异步”是异步模块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放在一个诺言中,但是那也不起作用,不确定现在该怎么办。
编辑:对于我来说,在移至下一个用户之前创建新文档很重要,我不想将它们添加到调用数组然后执行它,我需要检查上一个文档是否确实存在并接受一些下次进入循环时从中获取数据
嵌套异步和正确的错误处理已经有很多年了。 最近,有async
和await
语法来使Promise看起来像C#代码,但重要的是要学习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
)
}
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.