繁体   English   中英

异步等待在带有回调的函数调用中无法正常工作

[英]Async await not working properly in function call with callbacks

我是node.js的新手。我正在使用 await/async 来避免函数在完成前一个函数之前运行。首先是代码。

---------------first-----------
exports.createProfileUser = async (req, res, next) => {
    const {user_image,image_two,
    image_three,image_four,
    image_five} = req.files
try{

      var filetype = req.files.user_image.name.split(".");
      var newFileName =  "./public/images/"+Date.now() 
      +  Math.floor(100000 + Math.random() * 900000)
      + "."+filetype[1]

      await insertImages(req,newFileName)
      await createProfile(req,res,newFileName.substring(1), (result) =>{
        if(result){
          return res.json(result)
        }
        else{
            return res.json({
                status:false,
                message:'Error Occurred '
            })
        }  
      })
      . then((result) => {
        if(result){
            return res.json(result)
        }
        else{
            return res.json({
                status:false,
                message:'Error Occurred '
            })
          }
        })
}
catch(error){
    res.sendStatus(500) && next(error)
}};

在上面的代码中,我希望insertImages函数在调用createProfile之前完全完成。但这并没有发生。这是insertImages代码。

--------------two--------------
insertImages =  (req,baseFileName) =>{

      const {user_id} = req.fields
      var newFileNameTemp =  baseFileName.substr(1);

      if(image){
          let fileType = req.files.image_five.name.split(".")
          let name =  "./public/images/"+Date.now() + "." + fileType[1]
          let tempName = name.substr(1);

          fs.copyFile(req.files.image_five.path, 
            name, 
            async(err) => {
            if (err) {
                console.log("Error in copying file",err)
                return res.json({
                    status:false,
                    message:"Error occurred while updating Profile Pic Two of the user ",

            })
        }

          await makeGallery(user_id,tempName, (resultId)=>{
            console.log('resultId,',resultId)

        })
      });
}

}

复制文件后,我将一个对象保存在gallery架构中,然后获取其_id并将其更新给users架构。代码是。

--------------threee----------------
makeGallery =  async (user_id,imageName,callback) => {
  var g = new Gallery();

  g.image = imageName
  var saved = await g.save()
  .then( async (gallery) => {

      await Users.findOneAndUpdate({user_id: user_id},{$push: {gallery:[gallery._id]}}, 
          {  upsert: true }
          )
          .then(async(data) =>{
              await console.log("Successfully added");    
           })
           await callback(gallery._id)

     })
     .catch(err => {
         return {
             status:false,
             message:err.message,
         }
     });

}

我已经使用 await 所以函数会等到数据更新。 但这并没有达到我的预期。 createProfile函数在insertImages完成之前被调用。我在这里做错了什么?请更正我的代码,我被困在这个问题上。提前致谢。

主要是你没有与异步的fs.copyFile同步

>>> insertImages = async (req,baseFileName) => {
  const {user_id} = req.fields
  var newFileNameTemp =  baseFileName.substr(1);
  if(image){
    let fileType = req.files.image_five.name.split(".")
    let name =  "./public/images/"+Date.now() + "." + fileType[1]
    let tempName = name.substr(1);
>>> await new Promise(function(resolve, reject){
>>>   return fs.copyFile(req.files.image_five.path, name, err => {
        if (err) {
          console.log("Error in copying file",err)
          // you should return the response server elsewhere. NOT in insertImages..
          // you should throw a proper error as well
>>>       return reject(res.json({
            status:false, // should be 500 for internal server error
            message:"Error occurred while updating Profile Pic Two of the user ",
          }))
        }
>>>     return resolve()
      })
    })
  }

  await makeGallery(user_id,tempName, (resultId)=>{
    console.log('resultId,',resultId)
  })
}

最终,您可以使用

const copyFile = require('util').promisify(fs.copyFile)

所以你可以直接写

>>> insertImages = async (req,baseFileName) => {
  const {user_id} = req.fields
  var newFileNameTemp =  baseFileName.substr(1);
  if(image){
    let fileType = req.files.image_five.name.split(".")
    let name =  "./public/images/"+Date.now() + "." + fileType[1]
    let tempName = name.substr(1);
>>> await copyFile(req.files.image_five.path, name).catch(err => {
      console.log("Error in copying file",err)
>>>   throw res.json({ 
        status:false,
        message:"Error occurred while updating Profile Pic Two of the user ",
      })
    })
  }

  await makeGallery(user_id,tempName, (resultId)=>{
    console.log('resultId,',resultId)
  })
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM