【问题标题】:Wait for promise to finish before continuing等待承诺完成后再继续
【发布时间】:2021-05-21 00:43:34
【问题描述】:

我知道很多话题都是关于承诺和回调的。我尝试了很多方法,但还是没有成功。

我想要的是在本地编辑文件,保存然后上传到 S3。然后调用另一个函数从文件中读取并显示为列表

不幸的是,我遇到了错误,因为文件正在结束调用另一个函数来显示以读取,然后它正在 S3 中写入和保存,正如您在我的 [终端][1] 中看到的那样 该文件已正确编辑并上传到 s3

1- 我尝试使用 then 作为承诺一个接一个地执行

static async edit_product(req: any, res: any) {
    console.log('edit_product param request',req.body)
    try {
       ExcelFile.EditFile(prod.product_code,prod.product_name).then(rs=> res.status(200).json({'success'}) ) ).catch((err) => {
        console.error(err);
            })
            console.log('test')
        }

2- 使用 await 然后

static async edit_product(req: any, res: any) {
    console.log('edit_product param request',req.body)
    try {
        await ExcelFile.EditFile(prod.product_code,prod.product_name).then(rs=> rs)
        console.log('test')
        res.status(200).json({'success product edit':prod.product_code})
   }

3-上传文件到S3

static async UploadFileS3() {
            const file = config._path+config._foldername +config._filename
            var s3 = new aws.S3({ accessKeyId: config._ACCESS_KEY_ID,secretAccessKey: config._SECRET_ACCESS_KEY });
            var newversionId: string = ''
            const params = {
                    Bucket: config._BUCKET_NAME,
                    Key: config._filename // File name you want to save as in S3
               };
           return  s3.putObject(params, function(err, data) {
                    if (err) {console.log(err) }
                    newversionId = data.VersionId!
                    console.log("Successfully uploaded data ",newversionId);
              });
};

4-编辑文件

      const stream = new Stream.PassThrough();
      var dataFile =  wb.xlsx.readFile(file).then(rs=>{
      var sh = rs.getWorksheet(config._sheetname);
      for (let i = 2; i <= sh.rowCount; i++) { 
       let currRow =  sh.getRow(i); 
       if (currRow.getCell(1).text==product_code){
          currRow.getCell(2).value = product_name
          currRow.commit();
         break                           } }  
      console.log('edit ')
//save locally
      wb.xlsx.writeFile(file).then(rs=>{console.log('edit filed successfully')});
      const param = {Key: config._filename,
                     Bucket: config._BUCKET_NAME,
                     Body: stream,
                     ContentType: 'CONTENT_TYPE_EXCEL'
                     }
//save to s3 
     wb.xlsx.write(stream).then(() => {s3.upload(param, function (err,data) {    
              if (err) { console.log("Error", err);  }  
              console.log("Upload Success", data.ETag);
          ExcelFile.getAwsVersion().then(rs=>ExcelFile.saveFileBucketVersion(rs))
                                                                                                        })
                                })
                        })
                        return dataFile //return promise

我怎样才能让它尊重步骤,先编辑然后返回 res.status(200).json({'success'} [1]:https://i.stack.imgur.com/SsWhu.png

【问题讨论】:

  • 由于s3.putObject() 接受一个nodeback,它似乎不太可能也返回Promise。如果是这样,那么 UploadFileS3() 返回的内容不会被 await.then() 语法等待。

标签: async-await promise callback aws-sdk exceljs


【解决方案1】:

您的 EditFile 函数似乎没有等待 writeFile 结束。 for 循环启动 writeFile 函数,但它没有在那里等待。可能的解决方案是

  1. 将 write 函数移出 for 循环。无论如何,您可能会多次保存更改,这看起来很奇怪。

  2. 如果写入应该在循环中,则在此处使用与承诺兼容的循环(例如Bluebird.each

【讨论】:

  • 你是对的!我编辑它谢谢。但这并不能解决我的问题 :(
  • 你的新代码是什么?您能否更新您的问题,以便我更新答案。
猜你喜欢
  • 2018-04-25
  • 2018-10-02
  • 1970-01-01
  • 2017-09-07
  • 2013-04-25
  • 2019-11-01
  • 2021-05-06
  • 2015-10-03
相关资源
最近更新 更多