刚接手一个项目,有个文件上传分类功能,但每次只能操作一个文件,测试需要几十个上百个文件,效率实在太低了。 
于是让公司小弟改为可以支持批量上传,小弟在写的时候,发现后端只能一个文件处理结束后,才能接收下一个,在后端不修改的情况下,只能写递归来实现。
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