2017-01-03 63 views
1

我使用CryptoJs来获得PDF文件的散列(sha256)。如何从异步函数获取散列值?

我已经有我的文件的散列,但我不能在函数之外获得它。

这是我的代码:

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尚未加载该文件,因此散列值为空。如果我们将alert包装成一个函数,我们在onloadend之后调用该函数,那么我们可以使用函数外的值。

+0

它的工作,但我想要做一个Ajax请求,如果我添加一个Ajax请求到callBack函数,你的解决方案不起作用。你有什么想法吗? – wxcvbn

+0

它基本上是一样的。阅读异步调用。 Ajax调用在完成后也需要回拨。 – Mouser

+0

对不起,我不明白,我怎样才能对ajax请求进行回调? – wxcvbn