如何从异步函数中获取哈希值?

时间:2017-01-03 13:45:30

标签: javascript cryptojs

我使用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);

第一个警报给我sha,但第二个是空的。 如何将哈希定义到函数中以便在之后使用它?

如果我添加一个callBack函数就可以了。 但是我想创建一个Ajax请求,当我将请求添加到这样的callBack函数中时:

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 个答案:

答案 0 :(得分: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之后调用的函数中,我们就可以使用函数之外的值。