我创建了一个中间件,用于在创建新的个人资料图片/封面照片上传时删除 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/