我在创建新的个人资料照片/封面照片上传时创建了一个删除aws文件的中间件。
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.Button;
import android.widget.ImageButton;
/**
*To handle the main UI.
*/
public class ui extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
StringBuffer sb = new StringBuffer();
ImageButton btn;
int year_x,month_x,day_x;
final int DIALOG_ID=0;
public void showDialogOnButtonClick(){
btn=(ImageButton)findViewById(R.id.bread);
btn.setOnClickListener(
new View.OnClickListener(){
@Override
public void onClick(View v){
showDialog(DIALOG_ID);
Intent j=new Intent(ui.this,Read.class);
j.putExtra("date",sb.toString());
startActivity(j);
}
}
);
}
protected Dialog onCreateDialog(int id){
if(id==DIALOG_ID)
return new DatePickerDialog(this, dPickerListener ,year_x,month_x,day_x);
return null;
}
private DatePickerDialog.OnDateSetListener dPickerListener=new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
year_x=year;
month_x=monthOfYear+1;
day_x=dayOfMonth;
sb.append(day_x).append(month_x).append(year_x);
}
};
public void onwriteclick(View v){
if(v.getId()==R.id.bwrite){
showDialog(DIALOG_ID);
Intent j=new Intent(ui.this,write.class);
j.putExtra("date",sb.toString());
startActivity(j);
}
}
public void onpdfclick(View v){
if(v.getId()==R.id.bpdf){
showDialog(DIALOG_ID);
Intent j=new Intent(ui.this,noteselectorforpdf.class);
j.putExtra("date",sb.toString());
startActivity(j);
}
}
}
console.log结果:
//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();
}
}
使用上面的代码,我得到一个无限循环。但是,如果我使用for循环,它可以正常工作..
答案 0 :(得分:3)
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();
}
}
答案 1 :(得分:0)
WHILE概念存在问题 - s3.deleteObject等待回调,因此它具有异步功能。这样的功能不会阻止你的程序流程,所以代码的下一部分仍然可以正常工作。
所以你的while循环不会等待deleteObject结果。当对象尚未被删除时,执行下一轮循环。
//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();
}
}