if语句中的函数仅在第一次时未定义,但在休息时间也是函数调用

时间:2015-09-24 12:52:31

标签: javascript angularjs file-upload

我在尝试使用ng-upload之前检查文件扩展名,但在检查文件是否没有错误的正常情况下,我试图添加我的功能。 发生了一件非常奇怪的事。我第一次尝试上传时,收到了这个错误:

  

ReferenceError:未定义extension_check       at application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:76141       at Object.forEach(application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:26353)       在Scope。$ scope.uploadFiles(application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:76140)       at $ parseFunctionCall(application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:38330)       在更新时(application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:73683)       at application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:73695       at application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:42205       at completeOutstandingRequest(application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:30920)       在申请-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:31300

但在所有其他时间函数调用

代码:

$scope.uploadFiles = function(files) {
    $scope.files = files;


    angular.forEach(files, function(file) {
        if (file && !file.$error && extension_check(file.name)) {
            file.upload = Upload.upload({
              url: 'http://172.18.139.3:3000/attachments',
              file: file

            });

            file.upload.then(function (response) {
              $timeout(function () {
                file.result = response.data;
                if (file.result.header.status["code"] == "ERROR") {

                    file.$error = true
                    $scope.message = file.result.header.status.message
                    console.log('file ' + file.name + ' is got error . Message: ' + file.result.header.status.message);
                }

              });
            }, function (response) {
              if (response.status > 0)
                $scope.status.message = response.status + ': ' + response.data;
                // $scope.errorMsg = response.status + ': ' + response.data;
            });

            file.upload.progress(function (evt) {
              file.progress = Math.min(100, parseInt(100.0 * 
                                       evt.loaded / evt.total));
            });
        } 


        console.log(file)  
    });

    extension_check = function(name) {

        extension_allow = ['jpg','jpeg','bmp','png'];
        ext = name.substr(name.lastIndexOf('.')+1).toLowerCase();
        console.log (ext);
        flag = (extension_allow.indexOf(ext) > -1);
        console.log (flag);
        return flag;
    }

}

1 个答案:

答案 0 :(得分:1)

因为第一次执行for循环时,未定义变量extension_check。自从extension_check作为全局变量以来,第二次将具有函数引用。

一种解决方案是将extension_check的声明移到循环之上,另一种解决方案是通过使用函数声明语法来使用函数提升

$scope.uploadFiles = function (files) {
    $scope.files = files;


    angular.forEach(files, function (file) {
        if (file && !file.$error && extension_check(file.name)) {
            file.upload = Upload.upload({
                url: 'http://172.18.139.3:3000/attachments',
                file: file

            });

            file.upload.then(function (response) {
                $timeout(function () {
                    file.result = response.data;
                    if (file.result.header.status["code"] == "ERROR") {

                        file.$error = true
                        $scope.message = file.result.header.status.message
                        console.log('file ' + file.name + ' is got error . Message: ' + file.result.header.status.message);
                    }

                });
            }, function (response) {
                if (response.status > 0) $scope.status.message = response.status + ': ' + response.data;
                // $scope.errorMsg = response.status + ': ' + response.data;
            });

            file.upload.progress(function (evt) {
                file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
            });
        }


        console.log(file)
    });

    function extension_check(name) {

        var extension_allow = ['jpg', 'jpeg', 'bmp', 'png'];
        var ext = name.substr(name.lastIndexOf('.') + 1).toLowerCase();
        console.log(ext);
        var flag = (extension_allow.indexOf(ext) > -1);
        console.log(flag);
        return flag;

    }
}

您还可以在uploadFiles之外定义函数,因为它不依赖于任何闭包变量

var extension_check = function extension_check(name) {
    var extension_allow = ['jpg', 'jpeg', 'bmp', 'png'];
    var ext = name.substr(name.lastIndexOf('.') + 1).toLowerCase();
    console.log(ext);
    var flag = (extension_allow.indexOf(ext) > -1);
    console.log(flag);
    return flag;

}

$scope.uploadFiles = function (files) {
    $scope.files = files;

    angular.forEach(files, function (file) {
        if (file && !file.$error && extension_check(file.name)) {
            file.upload = Upload.upload({
                url: 'http://172.18.139.3:3000/attachments',
                file: file

            });

            file.upload.then(function (response) {
                $timeout(function () {
                    file.result = response.data;
                    if (file.result.header.status["code"] == "ERROR") {

                        file.$error = true
                        $scope.message = file.result.header.status.message
                        console.log('file ' + file.name + ' is got error . Message: ' + file.result.header.status.message);
                    }

                });
            }, function (response) {
                if (response.status > 0) $scope.status.message = response.status + ': ' + response.data;
                // $scope.errorMsg = response.status + ': ' + response.data;
            });

            file.upload.progress(function (evt) {
                file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
            });
        }


        console.log(file)
    });
}

还要注意将变量设为局部变量