刚接手一个项目,有个文件上传分类功能,但每次只能操作一个文件,测试需要几十个上百个文件,效率实在太低了。
于是让公司小弟改为可以支持批量上传,小弟在写的时候,发现后端只能一个文件处理结束后,才能接收下一个,在后端不修改的情况下,只能写递归来实现。
html代码
<input type="file" name="file" multiple id="file" onchange="angular.element(this).scope().onSelectFile(this)"/>
js代码如下 固定写死file.files[0],就是把文件传递给后台服务,然后后台处理完毕后再调用回调函数。
onSelectFile:function(){
this.voucherService.createResource(
file.files[0],
function(res){
this.$scope.currentVoucher.state = 0;
this.pushResource(res);
}.bind(this));
},
小弟改造为可以支持文件批量,递归代码如下:
// 上传多张图片
onSelectFile: function(){
this.uploadRule(0, file.files.length, null,function(b){
this.$scope.currentVoucher.state = 0;
this.pushResource(b);
}.bind(this));
},
uploadRule: function(count, sum, result, next){
if(count == sum){
next(result);
}else{
this.uploadRun(count, function(a){
count++;
result = a;
this.uploadRule(count, sum, result, next);
}.bind(this));
}
},
uploadRun: function(count, cb){
this.voucherService.createResource(
file.files[count],
function(res){
cb(res);
}.bind(this));
},
百科下,递归关系就是实体自己和自己建立关系
嘛,本来不是那么难的逻辑,怎么感觉小弟写的理解起来好绕,缺点就是
于是改为如下方式
// 上传多张图片
onSelectFile: function(){
this.uploadRule(0,null);
},
uploadRule: function(index, result){
if(index < file.files.length){
//单个文件发送不停递归发送
this.voucherService.createResource(
file.files[index],
function(res){
index++;
result = res;
this.uploadRule(index, result);//回调函数中调用下一个文件
}.bind(this));
}else{//结束递归
this.$scope.currentVoucher.state = 0;
this.pushResource(result);
}
},
改造说明:
尽量显式的让实体自己和自己建立关系,回归递归本身意义
。原文地址:http://blog.csdn.net/lichangzhen2008/article/details/46646395