javascript - Nodejs while 循环未按预期工作 - 变得无限

标签 javascript node.js

我创建了一个中间件,用于在创建新的个人资料图片/封面照片上传时删除 aws 文件。

//if previous awsKeys detected in req.body / images are detected : delete them.
exports.multipleDelete = function(req, res, next){
  var body = req.body;
  var awsKeyTrash = body.existingKeys;
  if(awsKeyTrash !== undefined){
    var j = 0;
    while (j < awsKeyTrash.length){
      console.log('j ', j)
      var key = awsKeyTrash[j];
      s3.deleteObject({
        Bucket: aws.bucket,
        Key: key
      }, function(err,data){
        if (err){
           console.log('delete err', err);
            j++;
          };
        console.log('deleted')
        res.send('deleted');
        j++;
      });
    }
    next();
  }
  else{
    next();
  }
}

console.log结果:

j  0
j  0
j  0
j  0
j  0
j  0
j  0
j  0
j  0
j  0 .....

使用上面的代码,我得到了一个无限循环。但是,如果我使用 for 循环,它就可以正常工作..

最佳答案

s3.deleteObject 是一个异步调用,您在调用仍在进行时立即迭代 while 循环!

您应该考虑使用异步框架,例如 async 。代码如下所示:

//if previous awsKeys detected in req.body / images are detected : delete them.
exports.multipleDelete = function(req, res, next){
  var body = req.body;
  var awsKeyTrash = body.existingKeys;
  if(awsKeyTrash !== undefined){
    var j = 0;
    async.whilst(
      function(){ return j < awsKeyTrash.length; }
      function(){
        console.log('j ', j)
        var key = awsKeyTrash[j];
        s3.deleteObject({
          Bucket: aws.bucket,
          Key: key
        }, function(err,data){
          if (err){
             console.log('delete err', err);
              j++;
          };
          console.log('deleted')
          res.send('deleted');
          j++;
        });
      },
      function(err){
        //while loop is finished!
        next();
    });
  }
  else{
    next();
  }
}

关于javascript - Nodejs while 循环未按预期工作 - 变得无限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41428426/

相关文章:

javascript - Bookshelfjs + bcrypt hashPassword 可以创建但不能更新

javascript - 如何在<td>和<tr>元素之间遍历?

javascript - 如何在 Javascript 中从 GSP 传递或使用变量

javascript - 无法在 Chrome 开发工具中编辑 javascript

node.js - 仅限移动设备 CORS 错误 : Origin is not allowed by Access-Control-Allow-Origin In Node. js

android - 加密 Node Js

php - 使用 innerhtml 编写带有大量引号的 html

javascript - JavaScript 中两个日期之间的月差

node.js - 如何使用 super 测试、 Passport 和 JEST 在 cookie 中使用 jwt 测试身份验证

node.js - 如何使用 pm2 集群模式 "npm start"