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

标签 javascript node.js asynchronous

我是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)
}};

在上面的代码中,我希望在调用 createProfile 之前完全完成 insertImages 函数。但这并没有发生。这是 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 schema.Code也就是说。

--------------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)
  })
}

关于javascript - 异步等待在带有回调的函数调用中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59883853/

相关文章:

javascript - Node.js/Javascript 通过设置 __proto__ 向现有对象引入方法

javascript - 使用 JavaScript 动态更改 Chrome 扩展程序图标

javascript - 如何在数据表中启用排序(延迟加载)?

javascript - 在Javascript中等待一些异步任务完成的最简单方法?

node.js - 从Buffer中读取二进制数据

ios - 在文档目录中下载或移动文件异步 - iOS

c# - 在一种方法中调用同步和异步方法(api/UI)的正确方法是什么

javascript - 我为什么/在哪里/什么时候应该这样做? (把js代码封装在一个函数里面然后执行)

node.js - Lambda Nodejs -( Node :1) UnhandledPromiseRejectionWarning: #<Object>

javascript - 如何设置在 node.js 中运行异步函数的时间限制?