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

标签 javascript angularjs file-upload

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

ReferenceError: extension_check is not defined at application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:76141 at Object.forEach (application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:26353) at Scope.$scope.uploadFiles (application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:76140) at $parseFunctionCall (application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:38330) at update (application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:73683) at application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:73695 at application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:42205 at completeOutstandingRequest (application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:30920) at application-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;
    }

}

最佳答案

因为第一次执行 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)
    });
}

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

关于javascript - if 语句中的函数仅在第一次时未定义,但在休息时间函数调用也未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32761824/

相关文章:

python - 使用Python ftplib上传文件时"' NoneType ' object has no attribute ' sendall '"

html - Wordpress 照片上传错误

javascript - TinyMCE 和 pluploader 不能一起工作

javascript - 多级引导下拉列表的问题

javascript - Jquery Mobile 记住是否单击了 href

javascript - jQuery AJAX 调用在传递 Rgraph 图像数据时返回 403 禁止错误

javascript - 如何使用angularJS突出显示可拖动元素下的拖放区?

javascript - 如何从js中的这个数组中提取标题?

javascript - 自动完成不起作用,它抛出错误 iElement.autocomplete 不是函数

css - 悬停下拉按钮时如何更改插入符号的颜色