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

Javascript 如何从异步函数中获取哈希值?,javascript,cryptojs,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.tar

我使用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);
我的控制台中出现以下错误:

Uncaught TypeError: Cannot read property 'words' of undefined

您需要一个回调函数:

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);
}
var reader=newfilereader();
var hash=“”;
reader.onloadend=函数(evt){
如果(evt.target.readyState==FileReader.DONE){//DONE==2
var i8a=新的Uint8Array(evt.target.result);

var a=[];for(var i=0;ivar 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); }