代码之家  ›  专栏  ›  技术社区  ›  Tushar Walzade

angularjs中的角度文件上传异步过滤器

  •  0
  • Tushar Walzade  · 技术社区  · 7 年前

    我使用angular file upload来上传文件,在这里我编写了一个过滤器,我需要 csv &选择要上载的文件;将它们与某些API的头文件匹配 . 我可以从csv和;API并对其进行比较,但上传器回调函数(如 uploader.onWhenAddingFileFailed(), uploader.onAfterAddingFile() )不要等待我的过滤器执行,它们会异步执行。

    所以 然后,根据响应(真/假),将发生进一步的操作。

    uploader.filters.push({
        name: 'fileTemplateFilter',
        fn: function(item /*{File|FileLikeObject}*/ , options, deferred) {
    
            var getCsvHeaders = function() {
                // $http.post(csvHeadersUrl + vm.vendorWithSearchItem.selected.vendorid + '&fileName=' + item.name)
                return $http.get('app/pages/utilities/inventoryMapper/csvHeader.csv')
                    .then(function(success) {
                        vm.tableHeaders = success.data;
                        return true;
                    }, function(error) {
                        vm.tableHeaders = undefined;
                        return false;
                    }).catch(function(e){
                        return false;
                    });
            }
    
            var getFileHeaders = function() {
                var r = new FileReader();
                r.onload = function(e) {
                    var contents = e.target.result;
                    contents = contents.split(/\r\n|\n/);
                    var i = 0,
                        flag = false,
                        headers;
                    while (i < contents.length && flag == false) {
                        if (contents[i] != '') {
                            headers = contents[i]
                            flag = true;
                        }
                        i++;
                    }
                    vm.fileHeaders = headers.split(",").map(function(item) { return item.trim() && item.replace(/['"]+/g, ''); });
                    return true;
                };
                r.readAsText(item);
                return false;
            }
    
            var isTemplateSame = function() {
                return Promise.all([getCsvHeaders(), getFileHeaders()]).then(function() {
                    if(vm.fileHeaders && vm.tableHeaders) {
                        var is_same = (vm.fileHeaders.length == vm.tableHeaders.length) && vm.fileHeaders.every(function(element, index) {
                            return element === vm.tableHeaders[index];
                        });
                        return is_same == true ? true : false;
                    }
                })
            }
    
            return Promise.resolve(isTemplateSame()).then(function(value) {
                return value;
            });
            // setTimeout(deferred.resolve, 1e3);
        }
    });
    

    这里,我需要以下信息-

    1) 我的过滤器读取整个 &然后返回标题;请建议改进代码,以便只读取标题而不是整个文件。

    2) 此过滤器中承诺的正确实现

    1 回复  |  直到 7 年前
        1
  •  0
  •   Tushar Walzade    7 年前

    我得到了实现承诺的解决方案。我用过 deferred 承诺(&P);这对我很有效。 PapaParse

    因此,我更新的过滤器如下-

    uploader.filters.push({
        name: 'fileTemplateFilter',
        fn: function(item /*{File|FileLikeObject}*/ , options, deferred) {
            vm.tableHeaders = undefined;
            vm.fileHeaders = undefined;
            var getCsvHeaders = function() {
                // return $http.get('app/pages/utilities/inventoryMapper/csvHeader.csv')
                return $http.post(csvHeadersUrl + vm.vendorWithSearchItem.selected.vendorid + '&fileName=' + item.name)
                    .then(function(success) {
                        vm.tableHeaders = success.data;
                        return vm.tableHeaders;
                    }, function(error) {
                        vm.tableHeaders = undefined;
                        throw error.status + " : " + error.data;
                    }).catch(function(e){
                        return false;
                    });
            }
    
            var getFileHeaders = function() {
                var defer = $q.defer();
                Papa.parse(item, {
                    worker: true,
                    skipEmptyLines: true,
                    step: function(results, parser) {
                        parser.abort();
                        vm.fileHeaders = results.data[0] || undefined;
                        results = null;
                        defer.resolve(vm.fileHeaders);
                    },
                    complete: function(results){
                        results = null;
                    }
                });
                return defer.promise;
            }
    
            $q.all([getCsvHeaders(), getFileHeaders()]).then(function() {
                if(vm.fileHeaders && vm.tableHeaders) {
                    var is_same = (vm.fileHeaders.length == vm.tableHeaders.length) && vm.fileHeaders.every(function(element, index) {
                        return element === vm.tableHeaders[index];
                    });
                    if(is_same == true) {
                        deferred.resolve(is_same);
                    } else {
                        toastr.error('file template doesn\'t match for this file - ' + item.name + ' ...!', 'Error');
                        deferred.reject(false);
                    }
                } else {
                    deferred.reject(false);
                }
            }, function(error) {
                deferred.reject(error);
            })
    
            return deferred.promise;
        }
    });