2017-01-03 2 views
1

Я использую CryptoJs для получения хэша (sha256) файла PDF.Как получить значение хеша из асинхронной функции?

У меня уже есть хэш моего файла, но я не могу получить его вне функции.

Это мой код:

var reader = new FileReader(); 
var hash = ""; 

reader.onloadend = function(evt) { 
    if (evt.target.readyState == FileReader.DONE) { // DONE == 2 
     var i8a = new Uint8Array(evt.target.result); 
     var a = []; for (var i = 0; i < i8a.length; i += 4) { a.push(i8a[i] << 24 | i8a[i + 1] << 16 | i8a[i + 2] << 8 | i8a[i + 3]); } 
     var wordArray = CryptoJS.lib.WordArray.create(a,i8a.length); 
     var hash = CryptoJS.SHA256(wordArray); 
     alert(hash); 
    } 
}; 

var blob = file.slice(0, file.size + 1); 
reader.readAsArrayBuffer(blob); 

alert(hash); 

Первое предупреждение дает мне ша, но второй пуст. Как я могу сделать, чтобы хэш определялся в функцию, чтобы использовать ее после?

если я добавлю функцию callBack, она работает. Но я хотел бы сделать запрос Ajax, и когда я добавить запрос в функцию обратного вызова, как это:

function callBack(hash){ 
    $.ajax({ 
      type: "POST", 
      url:"http://...", 
      dataType:'json', 
      data:({shaPdf: hash}), 
      success: function(data) { 
      //... 
      }, 
      error: function(error) { 
      } 
      }); 

У меня есть эта ошибка в моей консоли:

Uncaught TypeError: Cannot read property 'words' of undefined 

ответ

1

Вам необходимо перезвонить функция:

var reader = new FileReader(); 
var hash = ""; 

reader.onloadend = function(evt) { 
    if (evt.target.readyState == FileReader.DONE) { // DONE == 2 
     var i8a = new Uint8Array(evt.target.result); 
     var a = []; for (var i = 0; i < i8a.length; i += 4) { a.push(i8a[i] << 24 | i8a[i + 1] << 16 | i8a[i + 2] << 8 | i8a[i + 3]); } 
     var wordArray = CryptoJS.lib.WordArray.create(a,i8a.length); 
     var hash = CryptoJS.SHA256(wordArray); 
     callBack(hash); // <-- callBack at the end of this function 
    } 
}; 

var blob = file.slice(0, file.size + 1); 
reader.readAsArrayBuffer(blob); 

function callBack(hash) 
{ 
    alert(hash); 
} 

с вашего reader загружается файл асинхронно, второй alert огонь сразу после того, как другой код , reader еще не загрузил файл, поэтому hash пуст. Если мы обернем alert в функцию, которую мы вызываем после onloadend, мы можем использовать значение вне функции.

+0

Он работает, но после того, как я захотел сделать запрос ajax, и ваше решение не работает, если я добавлю запрос ajax в функцию callBack. У тебя есть идея? – wxcvbn

+0

Это в основном то же самое. Прочитайте асинхронные вызовы. Ajax-звонки также нуждаются в обратном вызове после их завершения. – Mouser

+0

Извините, я не понимаю, как я могу сделать обратный вызов по запросу ajax? – wxcvbn

Смежные вопросы