nodejs while循环不按预期工作 - 变得无限

时间:2017-01-02 14:12:14

标签: javascript node.js

我在创建新的个人资料照片/封面照片上传时创建了一个删除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循环,它可以正常工作..

2 个答案:

答案 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();
  }
}