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

function in if statement got undefined in first time only but in rest time the function call as well

本文关键字:休息时间 函数调用 未定义 语句 函数 第一次 if      更新时间:2023-09-26

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

ReferenceError: extension_check未定义在application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js: 76141在对象。forEach (application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js: 26353)在范围。美元范围。还是(application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js: 76140)$parseFunctionCall (application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:38330)在更新(application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:73683)在application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js: 73695在application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js: 42205在完成未完成请求(application-9d9dfe26d056c7fe9da969ebdf1e1f7f.js:30920)在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)
    });
}

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