我怎样才能用异步 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