gpt4 book ai didi

javascript - 等待保存后再继续该功能

转载 作者:太空宇宙 更新时间:2023-11-04 01:55:51 28 4
gpt4 key购买 nike

我有一个循环遍历用户数组,这个循环是异步的,我想要做的是为每个用户创建一个新文档并保存它并等待它保存,然后转到下一个用户。我能够处理何时转到下一个用户,所以我的问题是在保存新文档数据时。我正在使用 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 嵌套异步和正确的错误处理。最近出现了 asyncawait 语法,使 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
)
}
)

关于javascript - 等待保存后再继续该功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48025987/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com