如何从异步函数中获取哈希值?
How to get hash value from an asynchronous function?
我使用 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,但第二个警报是空的。
我怎样才能将散列定义到函数中以便之后使用它?
如果我添加一个回调函数,它就会工作。
但是我想发出一个 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
您需要回调函数:
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
之后调用它,我们就可以在函数外部使用该值。
我使用 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,但第二个警报是空的。 我怎样才能将散列定义到函数中以便之后使用它?
如果我添加一个回调函数,它就会工作。 但是我想发出一个 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
您需要回调函数:
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
之后调用它,我们就可以在函数外部使用该值。