I'm using angular-file-upload to upload files, where I'm writing a filter in which I need to take headers from the csv file selected for upload & match them with headers from some API. I'm able to get headers from both csv & API and comparing them, but uploader callback functions (like uploader.onWhenAddingFileFailed(), uploader.onAfterAddingFile()) do not wait for my filter to execute and they executes asynchronously.
So, uploader callback functions should wait till my filter function's execution and then, depending on response (true/false) further actions will be happened.
My current code for filter is -
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);
}
});
Here, I need following -
1) my filter reads whole
csv& then returns headers; Please suggest code improvements so that only headers will be read instead of whole file.2) The correct implementation of promise in this filter