首页 > 解决方案 > 我无法适当地重构代码

问题描述

router.get('/',ensureLogin,async (req,res)=>{
    try{
        let result = await Mock.find();
            result.forEach(async (e)=>{
                if(e.attemptedBy.includes(req.user._id)){
                    let a_Mock = await User.findOne({_id:req.user._id,"attemptedMock.setNo":e.setNo},{attemptedMock:1});
                    e.status="Attempted";// not accessible on template as res.render executes first
                    e.marks = a_Mock.attemptedMock[0].totalMarks;  //not accessible
                    console.log(a_Mock.attemptedMock[0].totalMarks);         
                }
                else{
                    e.status = "Unattempted";//it is accessible
                    console.log('else block')
                }
            })
           console.log("second log");
           res.render('dashboard',{mocks:result});//I want this code to be executed when the "result" is updated by "forEach" block
    }catch(e){
        console.log(e);
    }
})

控制台日志为: 1.“else block” 2.“second log” 3.“res.render executed” 4.“total scores”,这表明 res.render 在“if block's”语句“e.status='之前执行已尝试'",因此无法在模板页面上访问它。请告诉我如何以正确的方式重构。

标签: node.jsmongoose

解决方案


在每个内部,您可以将所有内容包装在函数中。

参考: https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all#:~:text= The%20Promise .,input%20iterable%20contains%20no%20promises 。

processE = async(e)=>{

  try{
  
     if(e){
       await something
       e.something 1= somevalue
     }else{
         e.something 2= somevalue
     }
     
     return false
  }catch(err){
     //you can also throw depends on how u handle your err and type of promise.something you use
     return err
  }
}

let promises = []
e.forEach( (e)=>{

      promises.push(processE(e))

})
/// Promise.something you can take a look at reference and use ethe one behavior that you prefer.
const result = await Promise.all(promises)

//render here


推荐阅读