我怎样才能用异步 await/promises 重写这个嵌套的回调地狱函数?
How can I rewrite this nested callback hell functions with the async await/promises?
我是 Nodejs
的新手。我必须一个接一个地执行一组功能,因为这些任务是相互依赖的。所以我想使用回调函数的方式,我调用另一个 callback
意味着 nested callbacks
一个接一个地达到结果。
但是后来在某个地方我开始了解 Callback Hells
并且应该避免这种情况。那么我现在很困惑如何使用 promises/ async-await
来实现它?
还有它与嵌套回调有何不同,因为在 promises 中,只有当第一个 promise 被解析时才会调用下一个 prmise,因此它也具有嵌套回调性质。
有人可以纠正我做错了什么吗?
router.route('/addTasks-approve').get(function(req, res) {
if(req.query.text == 'Approved')
{
User.updateMany({'Addtasks.commonID':req.query.id},
{$set: {"Addtasks.$.width" :'250px',
"Addtasks.$.height" :'32px',
"Addtasks.$.background" :'linear-gradient(45deg, #0f3443, #34e89e)',
"Addtasks.$.border_radius" :'10px / 5px',
"Addtasks.$.status" :req.query.text}},
function (error, success) {
if (!error) {
console.log("Approved color set!");
User.findOne({tag:'Admin','Addtasks.commonID':req.query.id},function (error, dataAdmin) {
if (error) {
console.log("error = "+ error);
res.end('{"msg" : "Some error occurred", "status" : 700}');
}
else {
dataAdmin.Addtasks.forEach(element => {
if(element.commonID == req.query.id)
{
User.findOneAndUpdate({tag:'Client','Addtasks.commonID':req.query.id},
{$push: {'Addtasks.$.Bigpaths4Clients':{$each : element.Bigpaths4Clients}},
$set: {"Addtasks.$.background" :'linear-gradient(45deg, #1E6305, #BDFF00)',
"Addtasks.$.status" :'Done'}},
function (error, data) {
if (error) {
console.log("error = "+ error);
res.end('{"msg" : "Unable to add the Task", "status" : 700}');
}
else {
console.log("Addtasks added to Client's dashboard succesfully");
sendMails2Client(data.email, element.topic, 'In Progress', 'Done');
sendMails2User(dataAdmin.email, element.topic, 'Done', 'Approved');
User.findOne({tag:'Admin','Addtasks.commonID':req.query.id},function (error, dataWriter) {
if (error) {
console.log("error = "+ error);
res.end('{"msg" : "Some error occurred", "status" : 700}');
}
else {
sendMails2User(dataWriter.email, element.topic, 'Done', 'Approved');
res.end('{"success" : "success", "status" : 200}');
}
})
}
})
}
});
}
});
}
else {
res.end('{"msg" : "Unable to set the status and color for Approved", "status" : 700}');
}
});
}
})
你可以使用这个 article,它是关于 Callback vs Promise vs async/await 的示例...
但我更喜欢 asyn/await
你的代码基于 asyn/await
:
router.route("/addTasks-approve").get(async (req, res) => {
if (req.query.text == "Approved") {
try {
let resUpdate = await User.updateMany(
{ "Addtasks.commonID": req.query.id },
{
$set: {
"Addtasks.$.width": "250px",
"Addtasks.$.height": "32px",
"Addtasks.$.background": "linear-gradient(45deg, #0f3443, #34e89e)",
"Addtasks.$.border_radius": "10px / 5px",
"Addtasks.$.status": req.query.text,
},
}
);
console.log("Approved color set!");
let dataAdmin = await User.findOne({
tag: "Admin",
"Addtasks.commonID": req.query.id,
});
dataAdmin.Addtasks.forEach(async (element) => {
if (element.commonID == req.query.id) {
let data = await User.findOneAndUpdate(
{ tag: "Client", "Addtasks.commonID": req.query.id },
{
$push: {
"Addtasks.$.Bigpaths4Clients": {
$each: element.Bigpaths4Clients,
},
},
$set: {
"Addtasks.$.background":
"linear-gradient(45deg, #1E6305, #BDFF00)",
"Addtasks.$.status": "Done",
},
}
);
console.log("Addtasks added to Client's dashboard succesfully");
await sendMails2Client(data.email,element.topic,"In Progress","Done");
await sendMails2User(dataAdmin.email,element.topic,"Done","Approved");
let dataWriter = await User.findOne({
tag: "Admin",
"Addtasks.commonID": req.query.id,
});
await sendMails2User(dataWriter.email, element.topic, "Done", "Approved");
res.end('{"success" : "success", "status" : 200}');
}
});
} catch (error) {
console.log(error)
}
}
});
但对于错误处理,您应该对代码中可能发生错误的任何部分使用 try/catch
我是 Nodejs
的新手。我必须一个接一个地执行一组功能,因为这些任务是相互依赖的。所以我想使用回调函数的方式,我调用另一个 callback
意味着 nested callbacks
一个接一个地达到结果。
但是后来在某个地方我开始了解 Callback Hells
并且应该避免这种情况。那么我现在很困惑如何使用 promises/ async-await
来实现它?
还有它与嵌套回调有何不同,因为在 promises 中,只有当第一个 promise 被解析时才会调用下一个 prmise,因此它也具有嵌套回调性质。
有人可以纠正我做错了什么吗?
router.route('/addTasks-approve').get(function(req, res) {
if(req.query.text == 'Approved')
{
User.updateMany({'Addtasks.commonID':req.query.id},
{$set: {"Addtasks.$.width" :'250px',
"Addtasks.$.height" :'32px',
"Addtasks.$.background" :'linear-gradient(45deg, #0f3443, #34e89e)',
"Addtasks.$.border_radius" :'10px / 5px',
"Addtasks.$.status" :req.query.text}},
function (error, success) {
if (!error) {
console.log("Approved color set!");
User.findOne({tag:'Admin','Addtasks.commonID':req.query.id},function (error, dataAdmin) {
if (error) {
console.log("error = "+ error);
res.end('{"msg" : "Some error occurred", "status" : 700}');
}
else {
dataAdmin.Addtasks.forEach(element => {
if(element.commonID == req.query.id)
{
User.findOneAndUpdate({tag:'Client','Addtasks.commonID':req.query.id},
{$push: {'Addtasks.$.Bigpaths4Clients':{$each : element.Bigpaths4Clients}},
$set: {"Addtasks.$.background" :'linear-gradient(45deg, #1E6305, #BDFF00)',
"Addtasks.$.status" :'Done'}},
function (error, data) {
if (error) {
console.log("error = "+ error);
res.end('{"msg" : "Unable to add the Task", "status" : 700}');
}
else {
console.log("Addtasks added to Client's dashboard succesfully");
sendMails2Client(data.email, element.topic, 'In Progress', 'Done');
sendMails2User(dataAdmin.email, element.topic, 'Done', 'Approved');
User.findOne({tag:'Admin','Addtasks.commonID':req.query.id},function (error, dataWriter) {
if (error) {
console.log("error = "+ error);
res.end('{"msg" : "Some error occurred", "status" : 700}');
}
else {
sendMails2User(dataWriter.email, element.topic, 'Done', 'Approved');
res.end('{"success" : "success", "status" : 200}');
}
})
}
})
}
});
}
});
}
else {
res.end('{"msg" : "Unable to set the status and color for Approved", "status" : 700}');
}
});
}
})
你可以使用这个 article,它是关于 Callback vs Promise vs async/await 的示例...
但我更喜欢 asyn/await
你的代码基于 asyn/await
:
router.route("/addTasks-approve").get(async (req, res) => {
if (req.query.text == "Approved") {
try {
let resUpdate = await User.updateMany(
{ "Addtasks.commonID": req.query.id },
{
$set: {
"Addtasks.$.width": "250px",
"Addtasks.$.height": "32px",
"Addtasks.$.background": "linear-gradient(45deg, #0f3443, #34e89e)",
"Addtasks.$.border_radius": "10px / 5px",
"Addtasks.$.status": req.query.text,
},
}
);
console.log("Approved color set!");
let dataAdmin = await User.findOne({
tag: "Admin",
"Addtasks.commonID": req.query.id,
});
dataAdmin.Addtasks.forEach(async (element) => {
if (element.commonID == req.query.id) {
let data = await User.findOneAndUpdate(
{ tag: "Client", "Addtasks.commonID": req.query.id },
{
$push: {
"Addtasks.$.Bigpaths4Clients": {
$each: element.Bigpaths4Clients,
},
},
$set: {
"Addtasks.$.background":
"linear-gradient(45deg, #1E6305, #BDFF00)",
"Addtasks.$.status": "Done",
},
}
);
console.log("Addtasks added to Client's dashboard succesfully");
await sendMails2Client(data.email,element.topic,"In Progress","Done");
await sendMails2User(dataAdmin.email,element.topic,"Done","Approved");
let dataWriter = await User.findOne({
tag: "Admin",
"Addtasks.commonID": req.query.id,
});
await sendMails2User(dataWriter.email, element.topic, "Done", "Approved");
res.end('{"success" : "success", "status" : 200}');
}
});
} catch (error) {
console.log(error)
}
}
});
但对于错误处理,您应该对代码中可能发生错误的任何部分使用 try/catch